FormatException при разборе десятичных знаков - PullRequest
2 голосов
/ 28 мая 2020

Я работаю над кодом для выставления счетов. Это небольшая часть моего кода:

private void NightsLabel_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true;
    }
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }

}

private void TotalButton_Click(object sender, EventArgs e)
{
    RoomChargeLabel.Text = (Convert.ToInt64(NightRateLabel.Text) + Convert.ToInt64(NightsLabel.Text)).ToString();
}

Я борюсь, когда нажимаю кнопку Total Button Click void. Каждый раз, когда я ввожу числа с десятичными знаками, я получаю сообщение об ошибке:

System.FormatException: «Входная строка имеет неправильный формат».

Всякий раз, когда я использую целые числа, все работает нормально, но мне нужно выяснить, почему я не могу использовать десятичные числа.

Пожалуйста, помогите! :)

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Как указывали другие, причина, по которой вы получаете ошибку, заключается в том, что анализ длинного (Int64) не поддерживает десятичные числа:

// Only supports whole numbers, throws an exception for decimal places!
(Convert.ToInt64(NightRateLabel.Text) + Convert.ToInt64(NightsLabel.Text)).ToString();

Я предполагаю, что NightRateLabel.Text - это собственно валютная (денежная) стоимость. В этом случае вы должны использовать decimal:

var nightRate = decimal.Parse(NightRateLabel.Text)

Вы также можете более эффективно обрабатывать сбои, используя TryParse:

// You can inline this (remove var success = ...) of course, but I'm being verbose to demonstrate:
var success = decimal.TryParse(NightRateLabel.Text, out var nightRate);
if (!success)
{
    // Handle parsing error gracefully: Show feedback to user, etc.
}
else
{
    // Do something with nightRate
}
0 голосов
/ 28 мая 2020

Вы используете Convert.ToInt64(NightRateLabel.Text), вы должны использовать Convert.ToDouble(NightRateLabel.Text)

Или вы можете выполнить проверку двойного преобразования

using System;

public class Program
{
    public static void Main()
    {
        var doubleVal = "123123";
        object fomattedValue = null;
        try {
            fomattedValue = Convert.ToInt64(doubleVal);
        } catch {
            fomattedValue = Convert.ToDouble(doubleVal);
        }

        Console.Write(fomattedValue.ToString());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...