Как я могу разделить числовую строку на 1000 без преобразования в число?

StackOverflow https://stackoverflow.com//questions/21060907

  •  26-12-2019
  •  | 
  •  

Вопрос

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

Изменено для отображения цифрами вместо X.

Итак, давайте установим, я получу число, вот такое.

234.123123123

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

0.234123123123

И, допустим, это 2,23123123123, то есть 0,0023123123123

Теперь я попытаюсь объяснить Формулу, используя свой английский.

В формуле необходимо изменить положение точки ".".Вы можете видеть, что он меняет место, Но вы также можете видеть, что я добавляю 0s.

Это важно, 0s необходимо добавить, ЕСЛИ точка попадает в крайний левый край (начало строки).

Итак, на сколько должна переместиться Точка?

Точка всегда должна перемещаться на 3 шага влево.

И если он попадает в стену (начало строки), вам нужно добавить 0 секунд, а затем одну 0 секунд перед точкой.

Итак, если число равно 2.222222 Сначала мне нужно будет переместить точку влево, давайте покажем шаг за шагом.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

Перед точкой всегда должно быть 0, если она когда-либо попадала в Начало.

Это звучит сложнее, чем есть на самом деле, просто я не знаю, как это объяснить.

Редактировать:

Моя попытка:

      TextPos = InStr(1, TextBox4.Value, ".") - 2
If (TextPos = 4) Then
     sLeft = Left(TextBox4.Value, Len(TextBox4.Value) - Len(TextBox4.Value) + 2)
      sRight = Right(TextBox4.Value, Len(TextBox4.Value) - 2)
      sFinal = (sLeft & "." & Replace(sRight, ".", ""))
      TextBox4.Value = Replace(sFinal, "-", "")
      End If
If (TextPos = 3) Then
      TextBox4.Value = "0." + Replace(TextBox4.Value, ".", "")
      End If
If (TextPos = 2) Then
      TextBox4.Value = "0.0" + Replace(TextBox4.Value, ".", "")
End If
If (TextPos = 1) Then
      TextBox4.Value = "0.00" + Replace(TextBox4.Value, ".", "")
End If
TextBox4.Value = Replace(TextBox4.Value, "-", "")

Если i / 1000, это может сработать, но, похоже, это изменит число, в результате чего оно выйдет из строя.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

Как вы можете видеть, это работает не так, как ожидалось.

Оно должно стать 0.0251521584671082E-02 (И, конечно, я не хочу, чтобы там было "E- ".Итак, если это возможно сделать, но ТОЛЬКО перемещая, а не фактически разделяя (я думаю, Excel ограничен количеством чисел, с которыми он может вычислять), тогда это сработает.

Стоит отметить, что показанные числа на самом деле меньше (короче) реального числа по какой-то причине, если я запишу его в текстовый файл, оно станет таким:

2.51521584671082E-02251521584671082E-02

Итак, как вы можете видеть, я, вероятно, уперся в стену при вычислении, поэтому оно меняется на Символы (я знаю, что математика использует их, но понятия не имею, что они означают, и для меня они в любом случае бесполезны).

И я думаю, что именно из-за них это терпит неудачу, хотя и не уверен.

Редактировать:

Хорошо, ограничившись 15 десятичными знаками, он вернет правильное место, но я бы хотел не делать этого по кругу, должен ли Excel действительно быть ограничен только 15 десятичными знаками, или это "Double, Float и т.д.", Который делает это?

ПРАВКА 2:

Пример Тони показывает это:

Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847

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

Если возможно, я хочу, чтобы ВСЕ десятичные дроби и числа оставались на своих местах, так как все уже правильно, просто они находятся не в том месте.

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

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

Я прихожу к выводу, что на этот вопрос дан ответ, он делает то, что я хочу, и ограничения заключаются в самом Расчете, а не в Решении.Все решения работают практически одинаково, но я выбрал решение Тони, поскольку он был первым, кто прокомментировал решение в моем вопросе.

Большое спасибо всем!

Это было полезно?

Решение

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

TextPos = InStr(1, TextBox4.Value, ".") - 2

Затем вы обрабатываете текстовые значения 4, 3, 2 или 1.Но если, например, TextBox4.Value = "2.22222", то TextPos = 0, и у вас нет кода для этой ситуации.

В 11:45 по Гринвичу я предположил в комментарии, что деление на 1000 даст вам результат, к которому вы стремитесь.В 14:08 по Гринвичу tunderblaster опубликовал это в качестве ответа.Сейчас 15:23, но вы не ответили ни одному из нас.

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

TextBox4.Value = Format(Abs(Val(TextBox4.Value)) / 1000, "#,##0.#########")

Единственным недостатком этого оператора является то, что он не сохраняет все конечные десятичные цифры.Действительно ли это важно?

Пока я готовил и публиковал этот ответ, вы отредактировали свой вопрос, указав, что деление на 1000 иногда дает результат в научном формате.Мое решение позволяет избежать этой проблемы.

Другие советы

Это кажется мне через все ваши правки, которые вы хотите разделить номер на одну тысячу.Для этого вы можете просто использовать

TextBox4.Value = TextBox4.Value / 1000
.

Если вы хотите избежать ошибки с плавающей точкой при разделении на 10, вы можете использовать тип Decimal

Private Sub CommandButton1_Click()
    Dim d As Variant
    d = CDec(TextBox1.Text)
    TextBox1.Text = d / 1000
End Sub
.

Это то, что вы пытаетесь?

Sub Sample()
    Dim sNum As String, SFinal As String
    Dim sPref  As String, sSuff As String
    Dim nlen As Long

    sNum = "234.123123123123123123131231231231223123123"

    SFinal = sNum

    If InStr(1, sNum, ".") Then
        sPref = Trim(Split(sNum, ".")(0))
        sSuff = Trim(Split(sNum, ".")(1))
        nlen = Len(sPref)

        Select Case nlen
            Case 1: SFinal = ".00" & Val(sPref) & sSuff
            Case 2: SFinal = ".0" & Val(sPref) & sSuff
            Case 3: SFinal = "." & Val(sPref) & sSuff
        End Select
    End If

    Debug.Print SFinal
End Sub
.

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

Function ShiftDecimalInString(str As String, Places As Long) As String
    Dim i As Long
    If Places > 0 Then
        ' Move DP to left
        '  Pad with leading 0's
        str = Replace$(Space$(Places), " ", "0") & str

        ' Position of .
        i = InStr(str, ".")
        str = Replace$(str, ".", "")

        If i > 0 Then
            ' Shift . to left
            str = Left$(str, i - Places - 1) & "." & Mid$(str, i - Places)

            ' strip unnecassary leading 0's
            Do While Left$(str, 2) = "00"
                str = Mid$(str, 2)
            Loop
            If str Like "0[!.]*" Then
                str = Mid$(str, 2)
            End If

            ShiftDecimalInString = str
        Else
            ' No . in str
            ShiftDecimalInString = str
        End If
    ElseIf Places < 0 Then
        ' ToDo: Handle moving DP to right
    Else
        ' shift DP 0 places
        ShiftDecimalInString = str
    End If
End Function
.

Это «ответить» ответы на вопрос, который вы хотите как можно больше точности в результате.

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

У меня есть значение, 2.46, что точнее до 2 десятичных знаков.Это истинное значение где-то в диапазоне от 2,455 до 2,465.

Если я кормирую эти значения в квадратный корневой функцию, я получу:

sqrt(2.455) = 1.566843961599240
sqrt(2.46)  = 1.568438714135810
sqrt(2.465) = 1.570031846810760
.

Из этого я вижу квадратный корень истинного значения - где-то между 1,567 и 1,570;Любые дополнительные десятичные цифры ложки.

Если я правильно понимаю, вы хотите использовать эти номера для настройки.Вы можете внести коррективы до 15 десятичных цифр?

Если вы помните свой исчислений, вы можете посмотреть «пропогенность ошибки» для лучшего объяснения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top