Увеличить последнюю цифру числа

VB2010 У меня есть пользовательская форма, в которой пользователь вводит числовой формат. Затем подпрограмма циклически перебирает список пар чисел и отображает их в списке категорий:

 User format "0.00"
                            0.00 - 164.04
                            164.04 - 410.10
                            410.10 - 820.21

Что я пытаюсь сделать, так это увеличить первое значение на одну цифру, чтобы не было перекрытия. что-то вроде:

                            0.00 - 164.04
                            164.05 - 410.10
                            410.11 - 820.21

Я пытаюсь сделать так, чтобы он работал с любым числовым форматом, который пользователь вводит, например «0,000» или «0,0». В настоящее время у меня есть (пример для значения 164,04)

1. Convert the value to a string "164.04"
2. Take the right most character "4" and convert to an integer 4
3. Increment the integer value by 1 to get 5
4. Take the characters in the string from step #1 except the last and then append
   the integer from Step #3 as a string to get "164.05".

Казалось, что это работает в моей программе VB6, но я хотел узнать, есть ли у кого-нибудь идеи получше. Я также не думаю, что я учел, что последняя цифра - 9.

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

Dim p As Integer
Dim numAsStr As String = num.ToString(fmt)
If numAsStr.IndexOf(".") = -1 Then
    p = 0
Else
    p = numAsStr.Length - numAsStr.IndexOf(".") - 1
End If
Dim result as Double = ((num* (10 ^ p) + 1.0) / (10 ^ p))

person sinDizzy    schedule 21.01.2014    source источник
comment
используйте numericupdown и установите минимальное значение для серии 2 на 0,01 больше, чем максимальное значение для серии 1 и т. д.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 22.01.2014
comment
Формат вводится пользователем, поэтому он может быть любым от 0,0 до 0,000000.   -  person sinDizzy    schedule 22.01.2014


Ответы (2)


Вот алгоритм:

1.Найти десятичные точки (p)

2.умножьте число на 10^p, увеличьте его на единицу, разделите обратно на 10^p

Dim numAsStr As String = num.ToString()
Dim p As Integer = numAsStr.Length - numAsStr.IndexOf(".") - 1
Dim numInt as Integer = 10^p * num
Dim result as Double = ((10^p *num + 1.0) / 10^p).ToString()
person Ali Alavi    schedule 21.01.2014
comment
ок сейчас тестирую. С некоторыми доработками работает. Важно добавить предполагаемый формат в Dim numAsStr As String = num.ToString(0.000) или что-то еще. - person sinDizzy; 22.01.2014
comment
Также, чтобы иметь дело с форматом 0 или 0. где результатом является целое число, я разделил на два случая. Если numAsStr.IndexOf(.) = -1, то результат Dim As Double = minVal + 1, а затем другой случай, как вы написали. - person sinDizzy; 22.01.2014
comment
@sinDizzy, пожалуйста, посмотрите на отредактированный ответ. Он полностью обновлен. - person Ali Alavi; 22.01.2014
comment
хорошо, позвольте мне взглянуть, но разве это не просто пропускает форматирование, такое как 0.000. - person sinDizzy; 22.01.2014
comment
Вам нужно позаботиться о форматировании при преобразовании его в строку, например. Console.WriteLine(result.ToString(0.000)) - person Ali Alavi; 22.01.2014
comment
@sinDizzy Хорошо, я думаю, что под 0.000 вы подразумеваете такие случаи, как 10.100. В этом случае оригинальный ответ - лучший выбор, я думаю. Тем более, что некоторые ошибки округления в логе в некоторых случаях приводят к неправильным результатам. - person Ali Alavi; 22.01.2014
comment
функция журнала срывается, когда значение равно нулю. я думаю, что это сработало, как вы предложили одну ревизию с моими настройками. - person sinDizzy; 22.01.2014
comment
ну да, пользователь введет строку формата, например 0.0 или 0.00000. Мой алгоритм должен адаптироваться к этому. глядя на ваше предыдущее предложение, которое работает лучше всего. позвольте мне проверить немного больше. - person sinDizzy; 22.01.2014
comment
некоторые настройки, которые я сделал, и это работает. во-первых, я добавил пользовательский формат, а во-вторых, я разделил на случай, когда результат не имеет десятичной точки или является целым числом. Dim p As Integer Dim numAsStr As String = num.ToString(fmt) If numAsStr.IndexOf(.) = -1 Then p = 0 Else p = numAsStr.Length - numAsStr.IndexOf(.) - 1 End If Dim результат как Double = ((число * (10 ^ р) + 1,0) / (10 ^ р)) - person sinDizzy; 22.01.2014
comment
Это работает для отрицательных и положительных чисел и почти для каждой строки форматирования, которую я ввожу. Это может быть сделано дальше, поскольку точка может быть не десятичным разделителем, как в некоторых европейских странах, но для меня это только для внутреннего использования. - person sinDizzy; 22.01.2014

Для этой проблемы используйте конструкцию ON ERROR RESUME NEXT.

person Kevin Melroy    schedule 09.07.2020
comment
Это просто проигнорирует ошибки. Зачем это использовать, если .NET предоставляет блоки try/catch для лучшей обработки ошибок? - person Nathan Champion; 09.07.2020