C#学习教程:使用任何小数分隔符将字符串解析为十进制该值表示货币值。目前我有这个解决方案:privateDecimalCastToDecimal(stringvalue){Decimalresult;varvalid=Decimal.TryParse(value,NumberStyles.Currency,null,outresult);返回有效?结果:-1;到目前为止,除了可能存在的文化差异外,这种方法效果很好。我是德国人,我希望大多数用户都能使用德语风格的标点符号。但有可能有人使用“.”。而不是“,”,转换将失败。"123,45"=>123.45"123.456,78"=>123456.78"123.45"=>12345<-我希望这里的结果是123.45有没有办法自动检测所用文化的十进制值?如果您使用德语或英语标点符号,您仍然会得到相同的结果,这有关系吗?更新:感谢您的帮助,我创建了一种方法来满足我的需要(我认为)。privatestaticDecimalCastToDecimal(stringvalue){DecimalresultDe;小数结果En;varstyle=NumberStyles.AllowDecimalPoint|NumberStyles.AllowThousands;varcultureDe=CultureInfo.CreateSpecificCulture("de-DE");varcultureEn=CultureInfo.CreateSpecificCulture("en-GB");vardeValid=Decimal.TryParse(value,style,cultureDe,outresultDe);varenValid=Decimal.TryParse(value,style,cultureEn,outresultEn);varminVal=Math.Min(resultDe,resultEn);varmaxVal=Math.Max(resultDe,resultEn);如果(!deValid)返回resultEn;如果(!enValid)返回resultDe;返回BitConverter.GetBytes(decimal.GetBits(minVal)[3])[2]>2?最大值:最小值;}这一段代码……Console.WriteLine(CastToDecimal("123,45"));Console.WriteLine(CastToDecimal("123.45"));Console.WriteLine(CastToDecimal("123,450"));Console.WriteLine(CastToDecimal("123.450"));Console.WriteLine(CastToDecimal("123.123,45"));Console.WriteLine(CastToDecimal("123,123.45"));返回:123,45123,45123450123450123123,45123123,45http://msdn.microsoft.com/en-us/library/3s27fasw%28v=vs.110%29中包含设置NumberStyle的解决方案。aspx可能有帮助...value="1.345,978";样式=NumberStyles.AllowDecimalPoint|NumberStyles.AllowThousands;culture=CultureInfo.CreateSpecificCulture("es-ES");if(Double.TryParse(value,style,culture,outnumber))Console.WriteLine("Converted'{0}'to{1}.",value,number);elseConsole.WriteLine("无法转换'{0}'。",value);//显示://将“1.345,978”转换为1345.978。价值=“1345,978”;if(Double.TryParse(value,style,culture,outnumber))控制台。WriteLine("将'{0}'转换为{1}。",value,number);elseConsole.WriteLine("无法转换'{0}'。",value);...我前段时间遇到了同样的问题。我的解决方案是用Java编写自己的解析器。该算法首先清理字符串。简单解释如下:ifchar='.从左到右扫描字符串。'然后dotFound=true;lastSeparatorPosition=索引;点++如果char=','那么commaFound=true;lastSeparatorPosition=索引;comma++ifdots==0&&commas==0thenitsinteger=>doneifdot>0&&comma>0,thentheoneinlastSeparatorPositionisthedecimalseparator.removeothersfromstring=>complete/*只有一种分隔符类型*/if(dot+comma)>1thenremovethem//asmustbethousandsseparator=>complete/*分隔符出现一次*/如果分隔符在numberOfDigits==3然后你必须决定:-)整数或小数,3位数小数7是唯一的问题,就像chiastic-security已经说过的。这里只能考虑概念环境。所有其他情况都是安全的。玩得开心。这是不可能的,因为有两个字符串在不同的文化中具有意义,但意味着不同的东西。例如:123.456123,456第一个在英国有123,在德国有123456;第二个是英国的123456,但略高于法国的123。唯一的解决方案是在输入上添加验证,如果是网页,给用户一个例子,然后根据用户的文化想办法获取输入。我建议您不要尝试做您正在尝试的事情,因为某些文化的货币存在冲突;美国/澳大利亚/许多其他国家/地区使用以下格式,其中45,999.95是千位分隔符,.是小数点分隔符,在一些欧洲国家45.999,95与上面的意思相同,但带有千位分隔符。并用作小数点分隔符。现在的问题是不能保证用户会同时使用这两种分隔符,您的系统可能会假设千位分隔符是小数等等。如果您真的不想打扰用户,请为主要货币和次要货币创建单独的输入字段。所以最好不要去那里。我相信这可能会有所帮助。快乐编码:)更新:日期格式也是如此,例如,在美国格式中,月份首先出现,然后是日期,而在澳大利亚,日期是第一个月,然后现在是2015年1月2日,输入将意味着不同的系统无法说明用户的意图。以上是C#学习教程:使用任意小数点分隔符将字符串解析为小数点。分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处:
