10299933000020004041324600000000 を 1029穣9933予2000京4041兆3246億 に変換する方法。
ActionScript で書かれているが、他の言語でも基本は一緒。
var score:Number = 10299933000020004041324600000000; var cValueUnit:Array = ["","万","億","兆","京","垓","予","穣","溝","澗","正","載","極","恒河沙","阿僧祇","那由多","不可思議","無量大数"]; var scorestr:String = String( score ); var epos:int = scorestr.search("e"); // 10^21以上の下処理 if ( epos >= 0 ) { var digit:int = parseInt(scorestr.substr( epos + 1 )); scorestr = scorestr.slice( 0, 1 ) + scorestr.slice( 2, epos ); for ( var ex:int = 0, exend:int = digit - scorestr.length + 1; ex < exend; ex++ ) { scorestr += "0"; } } var score_list:Vector.<String> = new Vector.<String>; var result:String = ""; for ( var i:int = scorestr.length, n:int = 0; i > 0; i -= 4, n++ ) { var val:int = parseInt( scorestr.slice( Math.max( 0, i - 4 ), i ) ); if ( val == 0 ) continue; result = String(val) + Enums.cValueUnit[n] + result; } trace("Score: " + result);
解説
- まず、数値を文字列に変換する。数値が勝手にe付き(10^21)以上になっていたら、eを取り除いて桁数分の0を後ろに足す。
- これは ActionScript の言語仕様なので、他の言語ではきっと不要。
- 文字列を四桁毎に分け、逆順(下の桁から)で結果に挿入していく。(0は弾く)
ポイント
- 単位リストの先頭は空なので、0〜9999までの先頭の四桁は単位が付かない。
- 一桁ずつ舐めていくと、「111100001111」が「1111億0000万1111」、または0を弾いても「1111億万1111」となり不自然である。
- その四桁が空かどうかを判定するには、四桁毎に区切って判定するしかない。