Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使TryParse与逗号或点十进制分隔符兼容_C#_Decimal_Tryparse_Regional Settings - Fatal编程技术网

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
        }