2016-05-15 4 views
2

タイトルには説明が必要だと思います。私は自分のプログラムを小さな数字に分割することを決してしませんでした。javascriptで数字を小さな部分に分割するにはどうすればよいですか?

たとえば、756が700,50,6に破損します。9123は9000,100,20および3となります。合理的なサイズの番号に対してこれを行う方法はありますか?ここで

+0

どのように出力をフォーマットしますか?数字の配列に? – jmancherje

+0

分割とモジュラスの組み合わせを使用して、目的の出力を得ることができます。たとえば、756/100 = 7、7 * 100 = 700とすると、756%100 = 56,56/10 = 5、5 * 10 = 50など... – BradStell

+0

@jmancherjeはい、数字の配列 – Edwin

答えて

5

Working Example

それを行うことができます関数です。

function breakNumbers(num){ 
    var nums = num.toString().split(''); 
    var len = nums.length; 
    var answer = nums.map(function(n, i) { 
    return n + (Array(len - i - 1).fill(0)).join(''); 
    }); 
    return answer.map(Number).filter(function(n) {return n !== 0;}); 
} 
+0

うわー!まあ、それはまさに私が探していたものです。ジョーダントンありがとう! – Edwin

+0

問題ありません!楽しい質問、ビットをちょっと変えなければならなかった – JordanHendrix

+2

間違いなく楽しい質問。私は2つのループでソリューションを提供しようとしていましたが、私はあなたの方が良いです。 – dchayka

2
function breakup(number) { 
    var digits = String(number).split('') 
    return digits.map(function(digit, i) { 
    return Number(digit.concat("0".repeat(digits.length - i - 1))) 
    }).filter(function(n) { return n !== 0 }) 
} 

だから最初、私たちは、数値を文字列にキャストしたいので、私たちのような原始的なStringにそれを渡しますso:String(number)

したがって、配列のsplitメソッドを呼び出し、空の文字列を渡します(これは、大文字)は数字の配列になります。すなわち、["7", "5", "6"]

次の部分を少し容易にするため、現在は文字列として残しておくことができます。 map関数を使用すると、配列の各要素で呼び出される関数を渡すことができます。この関数の最初の引数のほかに、オプションの2番目の引数があります。これは、配列内の項目のインデックスです。これは、私たちの場合に有効になります。数字が配列内のどこにあるのかを示すためです。

mapに渡される関数から返される値は、現在の数値文字列とconcatの別の文字列を取ります。これは、繰り返し番号"0"の数です。この数は、親配列の長さを調べ、ループされている現在の項目のインデックスから1を引いたものを引いて決定されます。これは、配列内の配列がJavaScriptでインデックス付けされているためです。最初の反復でi(インデックス)からdigits.lengthを減算した場合、値はそれぞれ30になるため、最初の値は7000になりますifあなたは756に合格しました。 Map関数内のreturnステートメントでは、Numberプリミティブにラップして、文字列からキャストすることに注意してください。

また、あなたはこれについて言及していませんが、私はあなたの例では0に等しい数字を持っていないと思います。返される前に最終配列のfilterを呼び出すことによって、0に等しくないアイテムだけが効果的に返されるようにすることができます。したがって、breakup(756)に電話すると[700, 50, 6]が届きますが、breakup(706)[700, 6]となります。

+0

答えをありがとう。あなたは0の部分でスマートな点を作る。私はあなたのコードを使用できるかどうかは、もう一方がうまくいかない場合に表示されます。 – Edwin

+0

'String.prototype.repeat'はInternet Explorerではまだサポートされていません。他のポスターの答えから 'Array.prototype.fill'もありません。これらの方法のいずれかを使用する場合は、ポリフィルを探す必要があります。代わりに、 'Array.prototype.push'は、他の答えの' fill'と同じことを達成することができます。 – pizzasynthesis

1

split()を使用して数字を区切る代わりに、正規表現を使用して数値文字列をトークン化しました。このようにして、小数点とそれに続く数字を1つのトークンとして扱うことで、末尾の小数点を簡単に処理できます。これにより、より大きな文字列の一部として数字を扱うことも可能になります。

function splitNumber(number) { 
    var parts = []; 
    var re = /(\d(?:\.\d*)?)/g; 
    while(next_part = re.exec(number)) { 
     // adjust place value 
     parts.forEach(function(element, index) { 
      parts[index] = 10 * element; 
     }); 

     parts.push(next_part[0]); 
    } 
    return parts.map(Number).filter(function(n) {return n !== 0}); 
} 
+0

私の解決策では、小数点以下を扱う別のサブ関数が必要になるでしょう...素敵な仕事! – pizzasynthesis

関連する問題