[英]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;
這兩個值是否相同? 是的,它們代表相同的數字。 如果將x
和y
的值轉換為字符串,則默認情況下它們都將以“ 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.203
和0,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.