You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor应用德语系统(三星)无法输入小数问题求助

解决Blazor德语系统下小数输入被清除的问题

问题根源

你的组件强制使用CultureInfo.InvariantCulture(以点.为小数分隔符)处理数值与字符串的转换,但德语系统下浏览器的<input type="number">会默认用逗号,作为小数分隔符。当用户输入逗号时,TryParse用InvariantCulture解析失败,不会更新CurrentValue;而OnParametersSet又会把原有的CurrentValue(仅整数部分)重新格式化为带点的字符串,覆盖用户输入,导致小数部分被立即清除。

解决方案

适配用户当前的系统文化,同时兼容多种分隔符输入,确保转换逻辑与浏览器行为一致。

修改后的组件代码

@using System.Globalization;

<input type="number"
       class="@CssClass"
       value="@CurrentValueAsString"
       id="@Id"
       step="any"
       disabled="@Disabled"
       @oninput="OnChange"/>

@code {
    [Parameter] public string CssClass { get; set; }

    [Parameter] public double CurrentValue { get; set; }

    [Parameter] public string Id { get; set; }

    [Parameter] public bool Disabled  { get; set; }

    private string CurrentValueAsString;

    [Parameter]
    public EventCallback<double> CurrentValueChanged { get; set; }

    protected override void OnParametersSet()
    {
        // 使用当前用户文化格式化数值,匹配系统的小数分隔符
        CurrentValueAsString = CurrentValue.ToString("0.##", CultureInfo.CurrentCulture);
    }

    private async void OnChange(ChangeEventArgs e)
    {
        var inputValue = (string)e.Value;
        // 优先用当前系统文化解析输入
        if (double.TryParse(inputValue, NumberStyles.Float, CultureInfo.CurrentCulture, out var value))
        {
            await UpdateCurrentValue(value);
        }
        // 兼容用户手动输入点分隔符的情况
        else if (double.TryParse(inputValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value))
        {
            await UpdateCurrentValue(value);
        }
        // 解析失败时保留用户输入,避免强制清除
        else
        {
            CurrentValueAsString = inputValue;
            StateHasChanged();
        }
    }

    async Task UpdateCurrentValue(double newValue)
    {
        CurrentValue = newValue;
        await CurrentValueChanged.InvokeAsync(CurrentValue);
        // 更新显示时用当前文化格式化,保证显示与输入一致
        CurrentValueAsString = CurrentValue.ToString("0.##", CultureInfo.CurrentCulture);
        StateHasChanged();
    }
}

关键修改点

  • 格式化适配文化:将OnParametersSet和UpdateCurrentValue中的格式化逻辑从InvariantCulture改为CultureInfo.CurrentCulture,确保显示的小数分隔符与系统语言一致。
  • 兼容多种分隔符:在OnChange中先尝试用当前文化解析,失败后再用InvariantCulture解析,覆盖用户手动输入点分隔符的场景。
  • 保留无效输入:解析失败时不重置输入内容,避免强制清除用户正在输入的内容,提升体验。

额外注意事项

如果是Blazor Server项目,需要确保服务器端的文化设置能正确匹配用户浏览器的文化,或者通过IJSRuntime获取浏览器的文化信息,进一步提升适配精准度。

内容的提问来源于stack exchange,提问作者user16725779

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:20:47