// get a temporary culture (clone) to modify
var ci = CultureInfo.InvariantCulture.Clone() as CultureInfo;
ci.NumberFormat.NumberDecimalSeparator = ",";
decimal number = decimal.Parse("1,1", ci); // 1.1
case 1:
var firstPunctuation = linq.ElementAt(0);
var firstPunctuationOccurence = value.Where(x => x == firstPunctuation).Count();
if (firstPunctuationOccurence == 1)
{
// we assume it's a decimal separator (and not a group separator)
value = value.Replace(firstPunctuation.ToString(), format.NumberDecimalSeparator);
}
else
{
// multiple occurence means that symbol is a group separator
value = value.Replace(firstPunctuation.ToString(), format.NumberGroupSeparator);
}
break;
8条答案
按热度按时间mwg9r5ms1#
您可以创建一个临时
CultureInfo
对象,以便在解析时使用。字符串
cgfeq70w2#
我找到了另一种方法。看起来很奇怪,但对我来说很有效。
因此,如果您不了解目标系统的文化,也不知道将获得哪个值,例如12.33或12,33,您可以执行以下操作
字符串
gg0vcinb3#
您只需要在调用
Parse
时设置正确的区域性,如下所示:字符串
50pmv0ei4#
您有以下可能性:
1.你知道文化
1.使用计算机已安装的当前区域性设置
1.让用户决定在程序中设置其区域性->用户设置
1.你不了解文化
1.你必须做出决定:你必须定义并记录你的决定
1.猜测:你试着解析,试着解析,试着……直到你得到有效的数字
ufj5ltwl5#
下面是我的实现,有什么好主意吗?
字符串
eiee3dmh6#
很好,但它仍然不是100%正确。当你使用情况1:你自动假设,','代表十进制数字。你至少应该检查它是否出现不止一次,因为在这种情况下,它是一个组分隔符号
字符串
t8e9dugd7#
使用TryParse两次,两种样式代表两种可能性
如果只有一个返回值,则使用该值如果两者都返回值,则使用绝对值较小的值。
如果你使用了错误的样式,TryParse将为使用分组和小数分隔符的数字返回0,但是如果你的字符串中没有分组分隔符(例如,一个数字小于1000),它将在两种情况下返回值,但是“错误”的数字将更大(绝对值)
4dc9hkyq8#
更简单的方法来获得十进制值作为字符串从字符串值与逗号或点作为小数点分隔符或逗号作为千位分隔符
字符串