Что нового

Преобразование переменной из текста в число до сотых

Dk

Новичок
Сообщения
358
Репутация
2
Версия AutoIt: 3.2.2

Описание:
Есть переменная (считывает кусок из тхт-файла)
Oна бывает разной. Например:
10,02
9,2
100

Мне нужно чтобы она была преобразована в числовое значение до сотых. Проще говоря нужно дописывать ещё один ноль 9,2 = 9,20, 100 = 100,00 , в первом случае всё в порядке.


Примечание

Нужно что бы считывал с запятой, преобразовывал если надо в точку, добавлял нули и потом снова переделывал в запятую на выходе.
ни в коем случае НЕ ДОЛЖНО округлять.
 

Sαuron

Новичок
Сообщения
45
Репутация
1
Код:
$a = '0.12'
$b = '1234.56789'
$c = '14'
$result_1 = stringformat('%.2f', $a)
$result_2 = stringformat('%.2f', $b)
$result_3 = stringformat('%.2f', $c)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3)
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Sαuron сказал(а):
Код:
$a = '0.12'
$b = '1234.56789'
$c = '14'
$result_1 = stringformat('%.2f', $a)
$result_2 = stringformat('%.2f', $b)
$result_3 = stringformat('%.2f', $c)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3)


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

vovsla

Осваивающий
Сообщения
607
Репутация
36
Код:
$a = '0.12'
$b = '1234.56789'
$c = '14'
$result_1 = stringformat('%.2f', StringReplace($a, ',', '.'))
$result_2 = stringformat('%.2f', StringReplace($b, ',', '.'))
$result_3 = stringformat('%.2f', StringReplace($c, ',', '.'))

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3)
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:

Vovsla сказал(а):
Код:
$a = '0.12'
$b = '1234.56789'
$c = '14'
$result_1 = stringformat('%.2f', StringReplace($a, ',', '.'))
$result_2 = stringformat('%.2f', StringReplace($b, ',', '.'))
$result_3 = stringformat('%.2f', StringReplace($c, ',', '.'))

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3)

Мне нужно чтобы в конце выдовало число с запятыми и ни в коем случае НЕ ДОЛЖНО округлять.
У вас изначально переменные с точками и в Боксе выдаёт тоже с точками, и округляет.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Dk
1. Используй функцию Number(), только заменить запятую на точку
2. Для функции stringformat(), вместо 2f впиши 30f
 

Sαuron

Новичок
Сообщения
45
Репутация
1
AZJIO сказал(а):
Dk
1. Используй функцию Number(), только заменить запятую на точку
2. Для функции stringformat(), вместо 2f впиши 30f
Так строка будет выровнена до 30 символов и ему надо, чтоб не округлялось значение.

Dk сказал(а):
Vovsla сказал(а):

Мне нужно чтобы в конце выдовало число с запятыми и ни в коем случае НЕ ДОЛЖНО округлять.
У вас изначально переменные с точками и в Боксе выдаёт тоже с точками, и округляет.

Код:
$a = '0,12'
$b = '123445,7'
$c = '123.0123000'
$d = '123,'
$e = '123.'
$f = '123.2'
$g = '123'

$result_1 = _format($a)
$result_2 = _format($b)
$result_3 = _format($c)
$result_4 = _format($d)
$result_5 = _format($e)
$result_6 = _format($f)
$result_7 = _format($g)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3&@crlf&$result_4&@crlf&$result_5&@crlf&$result_6&@crlf&$result_7)

func _format($param)
   $param = stringregexp($param, '([0-9]{1,30})(?:[.,]|)([0-9]{0,30})', 3)
   return $param[0]&','&stringformat('%.2s', $param[1]&'00')
endfunc
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Код:
$a = '0,12'
$b = '123445,7'
$c = '123.0123000'
$d = '123,'
$e = '123.'
$f = '123.2'
$g = '123'

$result_1 = _format($a)
$result_2 = _format($b)
$result_3 = _format($c)
$result_4 = _format($d)
$result_5 = _format($e)
$result_6 = _format($f)
$result_7 = _format($g)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3&@crlf&$result_4&@crlf&$result_5&@crlf&$result_6&@crlf&$result_7)

func _format($param)
	$param=StringReplace($param, '.', ',')
	$ParamArr=StringSplit($param, ',')
	If $ParamArr[0]=2 Then
		If StringLen($ParamArr[2])=0 Then
			Return $param&'00'
		ElseIf StringLen($ParamArr[2])=1 Then
			Return $param&'0'
		Else
			Return $param
		EndIf
	Else
		Return $param&',00'
	EndIf
endfunc
 

Sαuron

Новичок
Сообщения
45
Репутация
1
Да, так в два раза быстрее работает, но тогда нужна еще одна проверка, иначе не будет обрезать дробь до 2 цифр

Код:
$a = '0.12'
$b = '123445.7'
$c = '123.0123000'
$d = '123'
$e = '123.'
$f = '123.2'
$g = '123'
$timer = timerinit()
$result_1 = _format($a)
$result_2 = _format($b)
$result_3 = _format($c)
$result_4 = _format($d)
$result_5 = _format($e)
$result_6 = _format($f)
$result_7 = _format($g)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3&@crlf&$result_4&@crlf&$result_5&@crlf&$result_6&@crlf&$result_7&@crlf&@crlf&timerdiff($timer))

func _format($param)
    $param=StringReplace($param, '.', ',')
    $ParamArr=StringSplit($param, ',')
    If $ParamArr[0]= 2 Then
		 If StringLen($ParamArr[2])=0 Then
            Return $param&'00'
		 ElseIf StringLen($ParamArr[2])=1 Then
            Return $param&'0'
		 Elseif StringLen($ParamArr[2])>2 then
            Return StringTrimRight($param, StringLen($ParamArr[2]) - 2)
		 Else
			Return $param
		 EndIf
    Else
        Return $param&',00'
    EndIf
endfunc
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
[hide]
Sαuron сказал(а):
Да, так в два раза быстрее работает, но тогда нужна еще одна проверка, иначе не будет обрезать дробь до 2 цифр

Код:
$a = '0.12'
$b = '123445.7'
$c = '123.0123000'
$d = '123'
$e = '123.'
$f = '123.2'
$g = '123'
$timer = timerinit()
$result_1 = _format($a)
$result_2 = _format($b)
$result_3 = _format($c)
$result_4 = _format($d)
$result_5 = _format($e)
$result_6 = _format($f)
$result_7 = _format($g)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3&@crlf&$result_4&@crlf&$result_5&@crlf&$result_6&@crlf&$result_7&@crlf&@crlf&timerdiff($timer))

func _format($param)
    $param=StringReplace($param, '.', ',')
    $ParamArr=StringSplit($param, ',')
    If $ParamArr[0]= 2 Then
		 If StringLen($ParamArr[2])=0 Then
            Return $param&'00'
		 ElseIf StringLen($ParamArr[2])=1 Then
            Return $param&'0'
		 Elseif StringLen($ParamArr[2])>2 then
            Return StringTrimRight($param, StringLen($ParamArr[2]) - 2)
		 Else
			Return $param
		 EndIf
    Else
        Return $param&',00'
    EndIf
endfunc
[/hide]

Идеально! Работает!
К сожалению не могу поблагодарить (надо подождать сутки.) Завтра обязательно.
Огромное спасибо!


Добавлено:
Сообщение автоматически объединено:

[hide]
Vovsla сказал(а):
Код:
$a = '0,12'
$b = '123445,7'
$c = '123.0123000'
$d = '123,'
$e = '123.'
$f = '123.2'
$g = '123'

$result_1 = _format($a)
$result_2 = _format($b)
$result_3 = _format($c)
$result_4 = _format($d)
$result_5 = _format($e)
$result_6 = _format($f)
$result_7 = _format($g)

msgbox('', '', $result_1&@crlf&$result_2&@crlf&$result_3&@crlf&$result_4&@crlf&$result_5&@crlf&$result_6&@crlf&$result_7)

func _format($param)
	$param=StringReplace($param, '.', ',')
	$ParamArr=StringSplit($param, ',')
	If $ParamArr[0]=2 Then
		If StringLen($ParamArr[2])=0 Then
			Return $param&'00'
		ElseIf StringLen($ParamArr[2])=1 Then
			Return $param&'0'
		Else
			Return $param
		EndIf
	Else
		Return $param&',00'
	EndIf
endfunc
[/hide]



Спасибо Вам.
Работает.
Обязательно отблагодарю!
 
A

Alofa

Гость
Код:
Local $sText, $aArray[6] = ['0', '6,', '288.5619', '45,333', '14', '57,3']
For $i = 0 To 5
	$asVal = StringSplit($aArray[$i], ',.')
	$sText &= $asVal[1] & ',' & (($asVal[0] > 1) ? StringLeft($asVal[2] & '00', 2) : '00') & @LF
Next
MsgBox(4096, '', $sText)
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Там еще значения с точкой бывают.
А что это за синтаксис - (($asVal[0] = 2) ? StringLeft($asVal[2] * 10, 2) : '00') ?
Где про него можно почитать?

Код:
Local $aArray[5] = ['0', '288,5619', '14', '57,3', '12.45']
$sText=''
For $i = 0 To UBound($aArray)-1
    $asVal = StringSplit(StringReplace($aArray[$i], '.', ','), ',')
    $sText &= $asVal[1] & ',' & (($asVal[0] = 2) ? StringLeft($asVal[2] * 10, 2) : '00') & @LF
Next
MsgBox(4096, '', $sText)
 
A

Alofa

Гость
Vovsla сказал(а):
Там еще значения с точкой бывают.
Да ну. Где это сказано?
Но так или иначе - изменил скрипт.

Vovsla сказал(а):
А что это за синтаксис...
https://www.autoitscript.com/autoit3/docs/intro/lang_conditional.htm
https://www.autoitscript.com/autoit3/docs/keywords/Ternary.htm
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Пардон, попутал. Это в скрипте у Сарона точки появились :smile:
 
Верх