环境:
使用西班牙语文化,
组件: 表格
显示格式对的, 小数点西班牙这边是逗号(,) , 0.99 显示为 0,99
重现
编辑商品, 显示变成了0.99而不是正确的区域格式 0,99, 直接保存没事的
如果手动改了一下数字为 0.99 只要焦点变化了 就会格式化为 99 , 这个时候保存数据就出问题了
经过查询, 是 < input type="number" > 的限制性
所以, 渲染为文本框是最佳的办法了:
[AutoGenerateColumn(FormatString = "N2", Step = "0.01", Align = Alignment.Right, ComponentType = typeof(BootstrapInput
目前问题解决.
思考:
是不是可以做一个自动的机制, 非点号(.) 数字格式区域, 数字类型编辑自动渲染为文本框, 而不是数字框?
伪代码
/// <summary>/// 通过指定类型生成组件类型/// </summary>/// <param name="item"></param>private static Type GenerateComponentType(IEditorItem item){...string numberDecimalSeparator = CultureInfo.CurrentCulture?.NumberFormat?.NumberDecimalSeparator ?? ".";...else if (fieldType.IsNumber() && numberDecimalSeparator == "."){ret = typeof(BootstrapInputNumber<>).MakeGenericType(fieldType);} ...}
最终执行方案:
弄了个通用处理方法, 表格组件创建列的时候检查条件, 动态设置为对应的类型
/// <summary>/// 获得 当前输入语言小数点分隔符/// </summary>protected static string NumberDecimalSeparator => CultureInfo.CurrentCulture?.NumberFormat?.NumberDecimalSeparator ?? ".";/// <summary>/// 获得/设置 列创建时自动渲染按当前语言区小数点格式对应编辑组件, 默认 true/// </summary>[Parameter][NotNull]public bool AutoRenderComponentWithLocaleFormat { get; set; } = true;if (AutoRenderComponentWithLocaleFormat && OnColumnCreating == null){OnColumnCreating += AutoRenderComponentLocaleFormat;}/// <summary>/// 实现自动渲染组件类型/// </summary>/// <param name="columns"></param>/// <returns></returns>public static Task AutoRenderComponentLocaleFormat(List<ITableColumn> columns){if (NumberDecimalSeparator == "."){return Task.CompletedTask;}var items = columns.Where(i => i.ComponentType == null && IsNumberWithDecimalSeparator(i.PropertyType));foreach (var item in items){var type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType;if (Nullable.GetUnderlyingType(item.PropertyType)!=null){if (type == typeof(float)){item.ComponentType = typeof(BootstrapInput<float?>);}else if (type == typeof(double)){item.ComponentType = typeof(BootstrapInput<double?>);}else if (type == typeof(decimal)){item.ComponentType = typeof(BootstrapInput<decimal?>);}}else{if (type == typeof(float)){item.ComponentType = typeof(BootstrapInput<float>);}else if (type == typeof(double)){item.ComponentType = typeof(BootstrapInput<double>);}else if (type == typeof(decimal)){item.ComponentType = typeof(BootstrapInput<decimal>);}}} return Task.CompletedTask;}