数値に四桁毎の単位を付けて表示する

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」となり不自然である。
    • その四桁が空かどうかを判定するには、四桁毎に区切って判定するしかない。