前提
数値をKMGTに変換する処理を作成しました。
ただ「999999」を変換すると1Mになってしまいます。
おそらく下記の部分が不具合の原因かと思いますが、修正方法がわかりません。
C#
1 //有効桁数3桁+指数表記で文字列化 2 //※ここが原因? 3 var s = d.ToString("0.00E000");
ご教授いただければ幸いです。
実現したいこと
「999999」を変換すると"999.9K"になるのが理想です。
該当のソースコード
C#
1 /// <summary> 2 /// 単位をつけた文字列に変換します。 3 /// 12 -> 12 4 /// 1234 -> 1.23k 5 /// 123456 -> 123k 6 /// 12345678 -> 12.3m 7 /// 8 /// 単位:k, m, b, t, A, B, C, ... Z, AA, AB, AC, ... 9 /// 10 /// </summary> 11 /// <param name="d"></param> 12 /// <returns></returns> 13 public static string ToReadableString(this double d) 14 { 15 //マイナスは扱う気無し 16 if (d <= 0) return "0"; 17 //表示上は整数として見せるので、suffix(kmbtABC等)がつかない場合は少数部を破棄 18 if (d <= 1000) return ((int) d).ToString(); 19 20 //有効桁数3桁+指数表記で文字列化 21 //※ここが原因? 22 var s = d.ToString("0.00E000"); 23 24 //有効数字 25 float f = float.Parse(s.Substring(0, 4)); 26 27 //10の指数 28 var e = int.Parse(s.Substring(5, 3)); 29 30 //中途半端な指数は数値に掛け合わせておく 31 for (var i = 0; i < e % 3; i++) 32 { 33 f *= 10; 34 } 35 36 return f.ToString("###.##") + LevelToSuffix(e / 3); 37 } 38 39 /// <summary> 40 /// 10^3ごとにつけるSuffixの一覧 41 /// </summary> 42 private static string[] _suffixes; 43 44 private static string LevelToSuffix(int level) 45 { 46 if (_suffixes == null) 47 { 48 const string AtoZ = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 49 var list = new List<string>(); 50 list.Add(""); 51 list.Add("k"); 52 list.Add("m"); 53 list.Add("b"); 54 list.Add("t"); 55 for (var x = 0; x < AtoZ.Length; x++) 56 for (var y = 1; y < AtoZ.Length; y++) 57 { 58 var str = string.Format("{0}{1}", AtoZ[x], AtoZ[y]).Trim(); 59 list.Add(str); 60 } 61 62 _suffixes = list.Take(308).ToArray(); //doubleは指数308まで 63 } 64 65 return _suffixes[level]; 66 }

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。