C# 使TryParse与逗号或点十进制分隔符兼容
问题是: 假设您在区域设置中使用点“.”作为十进制分隔符,并用逗号对字符串进行编码C# 使TryParse与逗号或点十进制分隔符兼容,c#,decimal,tryparse,regional-settings,C#,Decimal,Tryparse,Regional Settings,问题是: 假设您在区域设置中使用点“.”作为十进制分隔符,并用逗号对字符串进行编码 string str=“2,5” 当您decimal.TryParse(str,out somevariable)时会发生什么它 somevariable将假定为0 你能做些什么来解决它 1- 你可以 decimal.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out somevariable); 它将返回25,而不是错误的2.5
string str=“2,5”代码>
当您decimal.TryParse(str,out somevariable)时会发生什么代码>它
somevariable
将假定为0
你能做些什么来解决它
1-
你可以
decimal.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out somevariable);
它将返回25,而不是错误的2.5
二,-
你可以
decimal.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out somevariable);
它将返回正确的值,但是,如果用户使用“”,“
作为十进制分隔符,它将不起作用
我无法使其工作的可能解决方案:
在区域设置中获取用户小数分隔符:
char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
以某种方式替换“,”,sepdec
,这样,如果它是逗号,它将保持为逗号,如果用户使用点,则替换为实际点
暗示
编辑:最近,许多用户在tryParse
上使用参数NumberStyles.Any,CultureInfo.GetCultureInfo(“pt pt”)
发布了有用的信息,如果将分隔符设置为“,”将无法工作,因此它几乎不能满足使tryParse“通用”的前提
我会解决这个问题,如果有人有更多的提示,欢迎光临我找到了一个解决方案,我是这个区域和逗号点主题的初学者,所以如果你有意见来提高对这个主题的理解,请欢迎
我们首先获取用户在表单{InitializeComponent();}
前面的区域选项中设置的十进制分隔符(我需要一个通用变量,它允许我更正代码)
在tryParse
中,为了使其具有通用性,我们将读取字符串中的点和逗号,并将它们转换为定义为sepdec
的十进制分隔符
decimal.TryParse(str.Replace(",",sepdec.ToString()).Replace(".",sepdec.ToString()), out somevariable);
我希望这有帮助,请评论改进建议 我知道这条线索有点老,但我试图提供一个答案
我使用正则表达式来确定字符串中使用的数字格式。
正则表达式还匹配没有小数分隔符的数字(“12345”)
嗯
Thomas不必检查培养基或替换,可以使用TryParse并支持两个分隔符,而无需太多代码
double d;
if (double.TryParse("12.3", System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out d))
Console.WriteLine("Value converted {0}", d);
else
Console.WriteLine("Unable to parse this number");
我使用的解决方案是简单地向用户显示解析后的值
我有一个自定义的TextBox
控件,它在控件失去焦点等情况下验证输入。如果控件需要一个浮点值(这是一个属性),那么它将尝试解析输入的值。如果TryParse
成功,我将在控件文本中显示out
值
这样,当用户输入12.3
时,该值可能会更改为123
,因为在当前区域性中,需要12,3
。然后由他们决定纠正这个问题。在Android Xamarin中,我多次遇到相同的问题。一些解决方案一直有效,直到Android升级到新版本,然后问题再次出现。所以我提出了一个通用的解决方案,效果很好。我将数字输入读取为文本,然后使用自定义解析器将其解析为十进制
无法解析为十进制时,自定义分析器返回0。它允许输入包含带逗号或点的十进制数的文本,且不带组分隔符:
public static decimal ParseTextToDecimal(string decimalText)
{
if (decimalText == String.Empty) return 0;
string temp = decimalText.Replace(',', '.');
var decText = temp.Split('.');
if (!Int32.TryParse(decText[0], out int integerPart)) return 0;
if (decText.Length == 1) return integerPart;
if (decText.Length == 2)
{
if (!Int32.TryParse(decText[1], out int decimalPart)) return 0;
decimal powerOfTen = 10m;
for (int i = 1; i < decText[1].Length; i++) powerOfTen *= 10;
return integerPart + decimalPart / powerOfTen;
}
return 0; // there were two or more decimal separators, which is a clear invalid input
}
公共静态十进制ParseTextToDecimal(字符串decimalText)
{
if(decimalText==String.Empty)返回0;
字符串temp=decimalText.Replace(',',');
var decText=临时拆分('.');
如果(!Int32.TryParse(decText[0],out int integerPart))返回0;
if(decText.Length==1)返回整数部分;
如果(decText.Length==2)
{
如果(!Int32.TryParse(decText[1],out int decimalPart))返回0;
十进制幂=10m;
对于(inti=1;i
2,5
在不同的国家可能有不同的解释。您只需使用正确的CultureInfo假设值为string str=“2500”代码>这现在代表什么值?2.5还是2500.0?除非您知道与此字符串值关联的区域性,否则无法确定。当它是特定于区域性的内容时,为什么要使用不变量区域性?@ng80092b我可以仅在tryparse范围内更改它吗?
当然可以。请参阅方法CultureInfo.GetCultureInfo
@ng80092b您的程序应将返回值false
视为错误,并根据您的程序进行适当处理。例如:if(decimal.TryParse(str,out val)){Console.WriteLine(“val:+val”);}else{Console.WriteLine(str+“无法解析!”);}
注意val
的值如何仅在TryParse
返回true
时执行的if
分支中使用。这会告诉用户str
的值不正确,用户应该使用不同的值。一般来说,将诸如“avh5v3l”这样的乱码视为有效的十进制值为零是没有意义的。这也不起作用,因为您只是用点替换逗号,再用点替换一个点。我不认为你可以有一个全球性的版本。但如果你说一个美国版本和一个本地版本,你可以在我的回答中这样做。使用tryparse返回trueit的结果它不起作用,因为2500.55将导致2.500.55,这可能无法解析。它起作用是因为在我的代码中,我只允许在文本框中放置一个点或一个逗号。从来没有一个点和一个逗号同时出现。我将有2500.55或2500.55相应的用户
double d;
if (double.TryParse("12.3", System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out d))
Console.WriteLine("Value converted {0}", d);
else
Console.WriteLine("Unable to parse this number");
public static decimal ParseTextToDecimal(string decimalText)
{
if (decimalText == String.Empty) return 0;
string temp = decimalText.Replace(',', '.');
var decText = temp.Split('.');
if (!Int32.TryParse(decText[0], out int integerPart)) return 0;
if (decText.Length == 1) return integerPart;
if (decText.Length == 2)
{
if (!Int32.TryParse(decText[1], out int decimalPart)) return 0;
decimal powerOfTen = 10m;
for (int i = 1; i < decText[1].Length; i++) powerOfTen *= 10;
return integerPart + decimalPart / powerOfTen;
}
return 0; // there were two or more decimal separators, which is a clear invalid input
}