【问题标题】:c# textbox number format without lose its first valuec#文本框数字格式不丢失其第一个值
【发布时间】:2021-09-26 13:27:19
【问题描述】:

我有带有文本框的 winform 项目。我将使用这些文本框进行数学运算。在文本框中,我想显示没有点的数字。外汇;

号码:123.384243333333333;

显示格式:123

所以我使用了下面的代码。

string result = (height * rate).ToString();
textbox1.Text = String.Format("{0:N0}", result);

但数学计算必须预先确定。如果我想达到文本框值

string Width= textbox1.Text;

宽度值为 123。但我想达到第一个值,即 123.384243333333333。 所以格式化后的结果会失去它的精度。我怎样才能保持第一个值?

我将标签属性用于其他操作。所以我不能用。

DataGirdView 控件通过单元格格式化事件为我们提供了这个机会。单元格显示不带点的值,但单元格保留真实(第一个)值。我正在寻找类似的东西。

【问题讨论】:

  • 利用类。
  • 步骤 1) 保持所有数值为数字! 不要将任何你想稍后处理的东西变成字符串,使用字符串 only 输出.第 2 步)你完成了。
  • @zaggler 你的意思是向文本框添加新属性吗?如果有怎么办?
  • 我不知道我怎么能。 仅使用数字进行计算。使用字符串 only 进行显示。 不要使用字符串中的值来计算任何东西。
  • TextBox派生一个新类,添加一个小数属性来保持值,在新属性的setter中截断值得到整数部分并设置到Text属性. Text = Math.Truncate(value).ToString();.

标签: c# formatting textbox numbers


【解决方案1】:

NumericUpDown

NumericUpDown 应该是此问题的默认选择,您可以在其中保留实际值并控制要显示的内容。在您的情况下,将DecimalPlaces 属性设置为0(默认值)并将MinimumMaximum 属性分别设置为Decimal.MinValueDecimal.MaxValue

public YourForm()
{
    InitializeComponent();
            
    numericUpDown1.Maximum = decimal.MaxValue;
    numericUpDown1.Minimum = decimal.MinValue;
    numericUpDown1.DecimalPlaces = 0; // Default...

    // The same for the other numeric controls...
}

或者,设置默认值的子类:

public class MyNumericUpDown : NumericUpDown
{
    public MyNumericUpDown()
    {
        Minimum = decimal.MinValue;
        Maximum = decimal.MaxValue;
    }

    /// <inheritdoc cref="NumericUpDown.Minimum"/>
    [DefaultValue(typeof(decimal), "-79228162514264337593543950335")]
    public new decimal Minimum { get => base.Minimum; set => base.Minimum = value; }

    /// <inheritdoc cref="NumericUpDown.Maximum"/>
    [DefaultValue(typeof(decimal), "79228162514264337593543950335")]
    public new decimal Maximum { get => base.Maximum; set => base.Maximum = value; }
}


文本框

如果旋转框不是一个选项并且您需要使用TextBox。创建一个新类并继承TextBox 控件,添加一个十进制属性来存储实际值并使用它的设置器将值的整数部分分配给Text 属性。如果您允许文本编辑/粘贴,您还需要覆盖OnValidating 方法来验证输入,如下所示。

[DefaultEvent("ValueChanged")]
[DefaultProperty("Value")]
[DesignerCategory("Code")]
public class IntTextBox : TextBox
{
    public IntTextBox() : base()
    {
        //Comment if you allow text edit/paste...
        ReadOnly = true;
        BackColor = SystemColors.Window;
    }

    private decimal _value;
    [DefaultValue(typeof(decimal), "0")]
    public decimal Value
    {
        get => _value;
        set
        {
            if (_value != value)
            {
                _value = value;
                Text = Math.Truncate(value).ToString();
                OnValueChanged(EventArgs.Empty);
            }
        }
    }

    protected override void OnValidating(CancelEventArgs e)
    {
        base.OnValidating(e);

        if (ReadOnly) return;
        // Change as required...
        if (Text.Trim().Length == 0) Value = 0;
        else if (decimal.TryParse(Text, out var res))
        {
            if (res % 1 != 0 && res != _value) Value = res;
            else if (res != Math.Truncate(_value)) Value = res;
        }
        else
            Text = Math.Truncate(Value).ToString();
    }

    // Handle this in the host instead of the TextChanged event if you need so...
    public event EventHandler ValueChanged;

    protected virtual void OnValueChanged(EventArgs e) =>
        ValueChanged?.Invoke(this, e);
}

使用此自定义 TextBox,忘记 Text 属性并改用 Value 属性来设置/获取值。

【讨论】:

    【解决方案2】:

    将初始值保留在文本框的“标记”属性中,并将其用作实际值:

     
    double result = height * rate;
    textbox1.Text = String.Format("{0:N0}", result.ToString());
    textbox1.Tag = result;
    //...
    double actualValue = double.Parse(textbox1.Tag.ToString());
    

    【讨论】:

    • 感谢您的时间和关注。但在解释中我写了我将标签属性用于不同的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2022-12-22
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多