簡體   English   中英

如何防止小數點。TryParse將“,”轉換為“。”?

[英]How to prevent decimal.TryParse convert “,” to “.”?

這是我的代碼:

string myValue = "0,203";

decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal;

...

myValueAsDecimal is 0.203 now

TryParse之后myValueAsDecimal是否可能具有0,203或decimal的內部表示形式始終為0.203,並且如果需要0,203則需要格式化GUI輸出?

TryParse之后myValueAsDecimal是否有0,203

不,這只是一個數字-它沒有文本格式的概念。 要考慮使用更簡單的類型的另一種方式,請考慮以下兩行代碼:

int x = 0x100;
int y = 256;

這兩個值是否相同? 是的,它們代表相同的數字。 如果將xy的值轉換為字符串,則默認情況下它們都將以“ 256”結尾-但是如果您請求十六進制表示形式,則它們都可能以“ 100”結尾。

區分變量的實際值和文本表示形式很重要。 很少的類型(我無法立即想到)隨身攜帶有關文本表示的信息-例如, DateTime可以從多種格式中解析出來,但沒有原始文本格式的“內存”。 它只是一個日期和時間,可以根據任何格式進行格式化。

如果您需要保持“十進制數字及其最初表示的區域性”的概念,則應為該配對創建自己的類或結構。 它本身不是decimal

decimal d = 0.203m;

Console.WriteLine(d.ToString(CultureInfo.InstalledUICulture));
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));        // decimal point: dot
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("en-US"))); // default decimal point: dot
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("ru-RU"))); // default decimal point: comma

結果:

0,203
0.203
0.203
0,203

看起來像你CurrentCulture,作為NumberDecimalSeparator ,這就是為什么你解析成功。

實際上0.2030,203與值相同。 唯一重要的是打印時它們的文本表示形式。

如果你想獲得你的價值為0,203表示,可以使用具有一種文化,作為NumberDecimalSeparator

例如,我的文化( tr-TR )有一個, 用十進制表示時,將得到0,203

string myValue = "0,203";
decimal myValueAsDecimal;
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal);
myValueAsDecimal.ToString(new CultureInfo("tr-TR")).Dump(); // 0,203

無論文化如何, Decimal的值都相同,

0.203

它的字符串表示形式(在您的情況下為小數點分隔符)發生了變化,因此,如果您想更改小數點分隔符並且不想更改文化,您可以在自定義NumberFormatInfo分配NumberDecimalSeparator例如

  Decimal d = 0.203M;

  NumberFormatInfo myNumberInfo = new NumberFormatInfo() {
    NumberDecimalSeparator = "," // Comma, please
  };

  String result = d.ToString(myNumberInfo); // "0,203"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM