2017-07-26 5 views
5

のため昏睡を追加昏睡で何千ものフォーマット、後続ゼロを保ち、背中の文字列に/小数とを倍増します。C#の変換文字列は、)(私は、ユーザー入力を取得し、それを解析し、S​​tring.Formatのを表示しようとしています何千

So, if user provides 
1000 I will display 1,000 
1000.00 => 1,000.00 
1000.0 => 1,000.0 
1,000.5 => 1,000.5 

は基本的に私は、提供された(末尾のゼロを含む)すべての小数を維持し、ちょうど何千ものフォーマットを追加したいです。 私が試した:doubleは、小数点以下の桁数を追跡しないよう

String.Format("{0:#,0.######}" , Decimal.Parse(input)); 
String.Format("{0:#,0.######}" , Double.Parse(input); 

答えて

7

double.Parse(input)は、何も行くではありません。

decimal.Parse(input).ToString()decimalは、そのトラックを保持していることを示します。残念なことに、decimal.Parse(input).ToString()はこの精度を使用し、桁区切り記号は使用せず、decimal.Parse(input).ToString("N")は精度を無視しますが、桁区切り記号を使用します。

手動で小数点以下の精度はしかし働きを抽出し、それはあなたが正しいフォーマット文字列構築することができます:これはthe layout of decimal as described on MSDNに基づいて

static string InsertThousandsSeparator(string input) { 
    var dec = decimal.Parse(input); 
    var bits = decimal.GetBits(dec); 
    var prec = bits[3] >> 16 & 255; 
    return dec.ToString("N" + prec); 
} 

ビット16〜23に含まれている必要がありますが0〜28の指数で、整数の除算に10の累乗を示します。

See it working on .NET Fiddle.(@Alissonの礼儀)

+0

これですべてのテストケースが合格しました(自分でテストしました)。ニースとクリーンなソリューション。 – Alisson

+0

優れています。どうもありがとう。私は本当に避けたいRegexを書く必要があると思っていました。 – Razkar

-1

あなたは1000年には、次1,000.00に変換気にしない場合、それはあまりにも、ユーザーのロケールを考慮して最善の方法です。

string output = String.Format("{0:n}", input); 

あなたは1000年がちょうど千、あなたは以下を使用することができるように変換したい場合:

string output2 = String.Format("{0:#,##0.##}", input); 
+0

"1000を1000.00に変換してもかまいません" - 質問の内容を無視しても問題ありません。 – hvd

+0

これはOPが求めているものではありません。彼らは小数点以下桁数を同じに保ちたい。 – Alisson

+0

質問を正しく読まずに不正解です。私の悪い。 – Sach

0

あなたはこのために正規表現を使用することができます。

var input = "1000.50000"; 
var regex = new Regex("^(?<int>-?[\\d,]+)\\.(?<fract>\\d+)$"); 
var match = regex.Match(input); 
var integralPart = match.Groups["int"].Value.Replace(",", ""); 
var fractionalPart = match.Groups["fract"].Value; 
var result = $"{decimal.Parse(integralPart):n0}.{fractionalPart}"; 
0
 public string DoFormat(string num) 
    { 
     int pt = num.IndexOf("."); 
     if (pt > 0) 
     { 
      return string.Format("{0:#,##0}", num.Substring(0, pt)) + num.Substring(pt, num.Length - pt); 
     } 
     else 
     { 
      return string.Format("{0:#,##0}", num); 
     } 
    } 

これは、分割文字列を小数点に返し、小数点以下のものはBUT形式で返されます。数値の整数部分カンマで。

関連する問題