Member 13408542 Ответов: 3

C# как изменить цифры с 111.11 на .11


Я хочу взять число, скажем 123456.7890, и удалить все, что находится перед десятичной точкой, оставив .7890, все ответы, которые я исследовал, оставляют числа, но без десятичной точки, так что 7890

Что я уже пробовал:

Я пробовал этот код, но получить входную строку было не в правильном формате на исключение: на последней строке

int multiplier = 100;
           double double_value = Convert.ToDouble(arcflipb);
           int arcflipe = (int)((double_value - (int)double_value) * multiplier);
           textBox50.Text = "."+arcflipe.ToString();
           String archconvert = textBox50.ToString();

           decimal arcflipf = Convert.ToInt64(archconvert);

3 Ответов

Рейтинг:
2

User 11061201

Use String.Split

string decPoint = ".";
string decNumber = "1241.546";
string result = decNumber.Split(CChar(decPoint))(1) //546
result = decPoint + result; //.546


Member 13408542

Показывает как CChar не существует в текущем контексте

Member 13408542

Не уверен, что я прав, но разве мой код не делает точно то же самое?

Рейтинг:
2

Graeme_Grant

Преобразуйте в десятичную дробь для точных вычислений, тогда это просто. Для этого я создал метод расширения:

static class DoubleExtension
{
    public static double GetDecimalPart(this double value)
    {
        var num = Convert.ToDecimal(value);
        return Convert.ToDouble(num - (int)num);
    }
}

Использовать:
double value = 12345.6789;
double result = value.GetDecimalPart();
// returns: 0.6789

Теперь, если вы хотите удалить десятичную дробь, вам нужно добавить следующее DoubleExtension класс:
public static int GetDecimalPart(this double value, int count)
{
    return (int)(value.GetDecimalPart() * Math.Pow(10, count));
}

Затем, чтобы использовать:
double value = 12345.6789;
int result = value.GetDecimalPart(5);
// returns: 67890

int result = value.GetDecimalPart(4);
// returns: 6789

int result = value.GetDecimalPart(3);
// returns: 678


ОБНОВЛЕНИЕ: Дейв справедливо указывает, что десятичная точка, никакой ведущий ноль не требуется. Тем не менее, запрос также относится к конечному нулю, поэтому вот фрагмент кода для этого:
double value = 12345.6789;
string finalResult = $".{value.GetDecimalPart(5).ToString()}";
// returns: .67890

И отдать дань уважения решению Дэйва:
double value = 12345.6789;
string finalResult = string.Format("{0}{1}",
    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
    value.GetDecimalPart(5).ToString());
// returns: .67890


Dave Kreskowiak

Это мило и все, но спецификация должна возвращать десятичную точку вместе с конечными числами, без чего-либо перед десятичной точкой, как в его примере было сказано: ".789". Это то, что int не может вернуть.

Я знаю, это очень странное требование.

Graeme_Grant

Спасибо... возможно,вы захотите проверить мое обновление. ;)

Dave Kreskowiak

Это жульничество, но ладно. Поскольку ОП никогда не прописывал ни точных входных данных, ни требований к возвращаемым значениям, любое решение вообще является тем, которое соответствует ограниченному результату, который он указал.

Graeme_Grant

Молоток... ноготь... вы решаете...: P

I want to take a number say 123456.7890 and remove everything before the decimal the leaving .7890

Dave Kreskowiak

Он никогда не говорил, для чего используется это странное требование. Его пример кода также, по-видимому, говорит о том, что определение точности также может быть необходимым. Кроме того, как насчет передачи целого числа? Десятичной точки нет, поэтому возвращать нечего, кроме пустой строки или исключения. И снова он ничего не говорит.

Так много вопросов, так мало ответов.

Graeme_Grant

Да, мне тоже интересно... Но просто для того, чтобы играть в нее (на международном уровне) безопасно, я добавил дань уважения вашему решению ;)

Рейтинг:
1

Dave Kreskowiak

Ваша операция не имеет большого смысла, и вы явно не описываете, что должно произойти в каждом случае, когда вы собираетесь использовать это. Другими словами, каковы ваши тестовые и граничные случаи? Важно ли количество десятичных знаков или оно должно возвращать только то, что находится справа от десятичной дроби, даже если там ничего нет (целое число)? Имеет ли значение культура? Не все форматируют числа типа "123 456,789". Вы также можете иметь "123.456, 789".

Версия quick'n'Dirty, которая обрабатывает культуру, может быть:

/// <summary>
/// Returns a string with everything to the right of the decimal point,
/// inclusive of the decimal point, for any value type.
/// </summary>
/// <remarks>123,456.789 returns ".789"</remarks>
static string GetValueDecimalString(ValueType value)
{
    // Default return value of an Empty string.
    string returnValue = string.Empty;

    // Get the current culture and extract the decimal separator string.
    CultureInfo currentCulture = CultureInfo.CurrentCulture;
    string decimalSeparator = currentCulture.NumberFormat.NumberDecimalSeparator;

    // Convert the passed-in value to a string using the format for the current culture.
    string stringValue = Convert.ToString(value);

    // Get the index of the decimal separator in the string.
    int position = stringValue.IndexOf(decimalSeparator);

    // Return the string starting at the position the decimal separator was found.
    // If the decimal separator wasn't found, just return the default Empty string.
    if (position >= 0)
    {
        returnValue = stringValue.Substring(position);
    }

    return returnValue;
}