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

如何为Blazor的InputNumber绑定的decimal值应用Math.Round去除小数位?

Blazor InputNumber 绑定decimal值自动舍入去除小数位实现方案

有三种可直接落地的方案,均不会改变DcValue的decimal类型:


方案1:修改属性setter(最省事,推荐单一场景使用)

直接在DcValue的属性定义里增加舍入逻辑,不需要修改组件绑定代码:

// 原模型中的属性修改为带私有字段的形式
private decimal _dcValue;
public decimal DcValue
{
    get => _dcValue;
    set => _dcValue = Math.Round(value, 0); 
    // 第二个参数为保留小数位数,填0即去除所有小数位;需要自定义舍入规则可追加MidpointRounding参数
}

原组件绑定代码保持不变即可:

<InputNumber class="someClass" @bind-Value="@DcValue"></InputNumber>

用户输入完成失焦后,值会自动舍入为整数decimal。


方案2:使用@bind-Value:after回调(适合不想修改模型定义的场景)

不需要调整DcValue的属性代码,直接修改组件绑定逻辑:

<InputNumber class="someClass" 
             @bind-Value="@DcValue"
             @bind-Value:after="() => DcValue = Math.Round(DcValue, 0)">
</InputNumber>

该逻辑会在InputNumber的绑定值更新后立即执行舍入,效果和方案1一致。


方案3:封装自定义通用组件(适合多页面复用的场景)

如果多个地方都需要用到自动舍入的decimal数字输入框,可以封装成公共组件避免重复编码:

  1. 新增组件文件InputRoundNumber.razor:
@inherits InputNumber<decimal>

<input @attributes="AdditionalAttributes"
       class="@CssClass"
       value="@CurrentValueAsString"
       @onchange="EventCallback.Factory.CreateBinder<string?>(this, inputValue =>
       {
           if (decimal.TryParse(inputValue, out var parsedVal))
           {
               CurrentValue = Math.Round(parsedVal, 0);
           }
       }, CurrentValueAsString)" />
  1. 使用时直接替换原有InputNumber即可:
<InputRoundNumber class="someClass" @bind-Value="@DcValue"></InputRoundNumber>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:36:04