如何为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数字输入框,可以封装成公共组件避免重复编码:
- 新增组件文件
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)" />
- 使用时直接替换原有InputNumber即可:
<InputRoundNumber class="someClass" @bind-Value="@DcValue"></InputRoundNumber>
内容的提问来源于stack exchange,提问作者tom33pr
相关产品推荐
相关产品推荐

