c# - 尝试将字符串条目解析为双精度,但小数点永远无法识别
问题描述
他们说要玩 CultureInfo 的地方有多个线程,但对我没有任何帮助。
我有一个 Xamarin.Forms 应用程序,用户输入一个字符串值,可以写成 90、90.1 或 90,9。然后将该值转换为 double 以进行一些计算。
xamarin 条目组件具有“数字”属性,因此用户只能输入数字和点或逗号,具体取决于设备的语言。
因为我一开始并不知道语言对点或逗号很重要,所以这是我的第一个实现:
public static double CalculateExposition(TasksGroup group)
{
return Math.Round(10 * Math.Log10(group.Taches.Sum(x =>
GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, double.Parse(x.TaskDBA.Replace(",", ".")) / 10.0)) / 8), 1);
}
您可以在下面查看更多详细信息,非常感谢您的帮助。
问题
这在 VS 2017 上的法语模拟器上运行良好(不知何故,我没有键盘限制,可以做逗号和点),直到我将我的应用程序从 vs 2017 升级到 2019 并使用使用 . 为小数点。
当我尝试使用英文模拟器时,这一点永远不会被识别,所以如果我输入 90.9,它将被识别为 909。
我尝试了什么(在他们说要使用 CultureInfo 的所有线程中,但它对我没有任何作用)
我尝试的另一件事是为允许用户使用的键盘实现自定义渲染器,或者。但显然我需要它基于语言。
public static double CalculateExposition(TasksGroup group)
{
return Math.Round(10 * Math.Log10(group.Taches.Sum(x =>
GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, double.Parse(x.TaskDBA.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture) / 10.0)) / 8), 1);
}
解决方案
您可以使用此扩展方法:
static class StringExtensions
{
private static readonly CultureInfo Fr = new CultureInfo("fr-FR");
public static decimal ToDecimal(this string value)
{
if (value.Contains(','))
return decimal.Parse(value, Fr);
return decimal.Parse(value, CultureInfo.InvariantCulture);
}
}
如果输入字符串包含逗号,则使用法语文化对其进行解析。如果没有,它将包含一个点或什么都没有。所以用InvariantCulture
(英语文化)解析它就可以了。
推荐阅读
- python - 有没有办法通过循环文件目录动态生成字典
- reactjs - findOne 没有特定元素的文档
- karate - 空手道独立作为具有多个功能文件的模拟服务器
- c# - .Net 反射以获取具有自定义属性的嵌套属性
- d3.js - 如何在 Angular 4+ 中实现 d3 词云?
- javascript - 如何通过滚动使导航栏文本颜色发生变化
- azure-devops - Azure Pipelines 从管道名称中排除提交消息
- python - 不返回 html 页面进行查看 - django
- blazor - 如何在 Blazor 的输入组件中有条件地使用 PreventDefault?
- imagemagick - ImageMagick 渐变比例