## ZTrim() : Remove redundant leading/trailing zeroes from a number

Post your working scripts, libraries and tools
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### ZTrim() : Remove redundant leading/trailing zeroes from a number

Edited by SKAN: Better version here: RoundT()

Code: Select all

``````ZTrim( N := "" ) { ; SKAN /  CD:01-Jul-2017 | LM:03-Jul-2017 | Topic: goo.gl/TgWDb5
Local    V  := StrSplit( N, ".", A_Space )
Local    V0 := SubStr( V.1,1,1 ),   V1 := Abs( V.1 ),      V2 :=  RTrim( V.2, "0" )
Return ( V0 = "-" ? "-" : ""   )  ( V1 = "" ? 0 : V1 )   ( V2 <> "" ? "." V2 : "" )
}

;---------------------------------------------------------------------------------
; Example:

MsgBox % ( A := 1.234000    ) "`t=`t" ZTrim( A ) "`n"
. ( A := 00.00100    ) "`t=`t" ZTrim( A ) "`n"
. ( A := -123.010    ) "`t=`t" ZTrim( A ) "`n"
. ( A := -.212       ) "`t=`t" ZTrim( A ) "`n"
. ( A := "+001. 100" ) "`t=`t" ZTrim( A ) "`n"
. ( A := "1 .12300 " ) "`t=`t" ZTrim( A ) "`n"
. ( A := 100.00      ) "`t=`t" ZTrim( A ) "`n"
. ( A := 100         ) "`t=`t" ZTrim( A ) "`n"                                   ``````
Last edited by Suresh on 02 Jul 2017, 16:23, edited 1 time in total.
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Very nice function, thanks for sharing.

Is it a bug or a feature?

Code: Select all

``````V := StrSplit( N,  .,  A_Space )
versus
V := StrSplit( N, ".", A_Space )
``````
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

wolf_II wrote:Is it a bug or a feature?
A mistake..

Edited.. Thanks for pointing it
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Suresh wrote:A mistake..
It worked though!
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

wolf_II wrote:It worked though!
I'm surprised, But only the dot works.. Accidental discovery.
carno
Posts: 208
Joined: 20 Jun 2014, 16:48

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Very useful!
SpeedMaster
Posts: 357
Joined: 12 Nov 2016, 16:09

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Nice function but only works for the half of the world

https://en.wikipedia.org/wiki/Decimal_m ... arator.svg

Maybe add an option for the decimal Mark ?

ZTrim( N := "" , DM:="." )

Code: Select all

``````MsgBox % ( A := 1,234000 euro   ) "`t=`t" ZTrim( A ) "`n"
. ( A := 00,00100 euro   ) "`t=`t" ZTrim( A ) "`n"
. ( A := € 100,10        ) "`t=`t" ZTrim( A ) "`n"
. ( A := 00100,001 €     ) "`t=`t" ZTrim( A ) "`n"
``````
Helgef
Posts: 4067
Joined: 17 Jul 2016, 01:02
Contact:

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Nice function, thanks for sharing.
Suresh wrote:
wolf_II wrote:It worked though!
I'm surprised, But only the dot works.. Accidental discovery.
I'm literally surprised too

Code: Select all

``````msgbox, % .
``````
jNizM
Posts: 2560
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

@SpeedMaster
For currency you should use GetCurrencyFormat / GetCurrencyFormatEx or GetNumberFormat / GetNumberFormatEx for numbers with normal number format 2,999.99 / 2.999,99
[AHK] 1.1.30.03 x64 Unicode | [WIN] 10 Pro (Version 1909) x64 | [GitHub] Profile
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

SpeedMaster wrote:Nice function but only works for the half of the world
The intended use for ZTrim() is to counter the effect of using high floating point precision with SetFormat and Format()

Code: Select all

``````SetFormat, Float, 0.12
A := 1 / 4
B := 4.1 * 100
C := 22 / 7

MsgBox % ( A := 1 / 4     ) "`t=`t" ZTrim( A  ) "`n"
. ( B := 4.1 * 100 ) "`t=`t" ZTrim( B  ) "`n"
. ( PI := 22 / 7   ) "`t=`t" ZTrim( PI ) "`n"
``````
• ---------------------------
Ztrim.ahk
---------------------------
0.250000000000 = 0.25
410.000000000000 = 410
3.142857142857 = 3.142857142857

---------------------------
OK
---------------------------
Ofcourse, you are free to alter the function anyway you want.
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Helgef wrote:I'm literally surprised too

Code: Select all

``````msgbox, % .
``````

Code: Select all

``msgbox, % "A" . "B"``
Works properly when concatenating.. I wouldn't know as I rarely use dot to concatenate strings.
SpeedMaster
Posts: 357
Joined: 12 Nov 2016, 16:09

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Suresh wrote: The intended use for ZTrim() is to counter the effect of using high floating point precision with SetFormat() and and Format()
I now understand the purpose of this function thanks for your explanation

Code: Select all

``````dot=`a
msgbox, % dot

``````
Helgef
Posts: 4067
Joined: 17 Jul 2016, 01:02
Contact:

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Code: Select all

``````dot=`a
msgbox, % dot
``````
#EscapeChar wrote:`a alert (bell) -- corresponds to Ascii value 7. It can also be manifest in some applications by typing Control+G.

For circular reference, see Dot interpreted as literal string even when unquoted.
SpeedMaster
Posts: 357
Joined: 12 Nov 2016, 16:09

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Ah! it's a bell, I thought it was a dot.
Here the result with the whole alphabet :

Code: Select all

``````chars=`a`b`c`d`e`f`g`h`i`j`k`l`m`n`o`p`q`r`s`t`u`v`w`x`y`z`.
msgbox, % chars
``````
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Helgef wrote:For circular reference, see Dot interpreted as literal string even when unquoted.
Thanks for the topic. Good ,this has been clarified.
FanaticGuru
Posts: 1380
Joined: 30 Sep 2013, 22:25

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

Not that it matters much but I just use a RegEx to get rid of trailing zeros.

Code: Select all

``````; Remove Trailing Zeros
N := "100.0000"
MsgBox % RegExReplace(N, "\.0*\$|(\.\d*?)0*\$", "\$1")
``````
If you want a function, I guess you could do:

Code: Select all

``````RemoveTrailingZeros(N)
{
return RegExReplace(N, "\.0*\$|(\.\d*?)0*\$", "\$1")
}
``````
It does not do leading zeros as I never had the need but that is pretty easy to add: RegExReplace(N, "^0*|\.0*\$|(\.\d*?)0*\$", "\$1")

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts

AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon

[Function] Timer - Create and Manage Timers
jeeswg
Posts: 6904
Joined: 19 Dec 2016, 01:58
Location: UK

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

It's tricky to do this in a RegEx one-liner, I'm not sure that any of the attempts above cover all of the list below for example, here's an attempt I made:

Code: Select all

``````q::
;crop leading zeros (maintain minus sign, keep a 0 if required)
vList := "1000,-1000,000,-000,00.00,-00.00,0.0,-0.0,00123,-00123,00123.123,-00123.123,00.123,-00.123,2.00500,-2.00500,2.500,-2.500,2.000,-2.000,0002000.0002000,-0002000.0002000"
vOutput := ""
Loop, Parse, vList, % ","
{
vNum := A_LoopField
vOutput .= vNum "`t`t" RegExReplace(vNum, "^-?\K0+(?=[^0.]|0\.|0\$)") "`r`n"
;vOutput .= vNum "`t`t" RegExReplace(vNum, "^-?\K0+") "`r`n" ;never keeps a leading zero
}
;Clipboard := vOutput
MsgBox, % vOutput

;crop trailing zeros after decimal point (remove decimal point if required)
vOutput := ""
Loop, Parse, vList, % ","
{
vNum := A_LoopField
vOutput .= vNum "`t`t" RegExReplace(vNum, "\.0+\$|\..*?\K0+\$") "`r`n"
}
;Clipboard := vOutput
MsgBox, % vOutput

vOutput := ""
Loop, Parse, vList, % ","
{
vNum := A_LoopField
vOutput .= vNum "`t`t" RegExReplace(vNum, "^-?\K0+(?=[^0.]|0\.|0\$)|\.0+\$|\..*?\K0+\$") "`r`n"
;vOutput .= vNum "`t`t" ZTRim(vNum) "`r`n"
}
;Clipboard := vOutput
MsgBox, % vOutput
return

;==================================================

;ZTrim() : Remove redundant leading/trailing zeroes from a number - AutoHotkey Community
;https://autohotkey.com/boards/viewtopic.php?f=6&t=33960

ZTrim( N := "" ) { ; SKAN /  CD:01-Jul-2017 | LM:03-Jul-2017 | Topic: goo.gl/TgWDb5
Local    V  := StrSplit( N, ".", A_Space )
Local    V0 := SubStr( V.1,1,1 ),   V1 := Abs( V.1 ),      V2 :=  RTrim( V.2, "0" )
Return ( V0 = "-" ? "-" : ""   )  ( V1 = "" ? 0 : V1 )   ( V2 <> "" ? "." V2 : "" )
}
``````
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

FanaticGuru wrote:Not that it matters much but I just use a RegEx to get rid of trailing zeros.

Code: Select all

``````; Remove Trailing Zeros
N := "100.0000"
MsgBox % RegExReplace(N, "\.0*\$|(\.\d*?)0*\$", "\$1")
``````
Very nice!. Removing trailing zeroes should be sufficient most of the times.
Thanks for sharing!
FanaticGuru wrote:It does not do leading zeros as I never had the need but that is pretty easy to add: RegExReplace(N, "^0*|\.0*\$|(\.\d*?)0*\$", "\$1")
The solution doesn't handle negative number.
Suresh
Posts: 35
Joined: 03 May 2016, 18:58

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

jeeswg wrote:here's an attempt I made
Very nice! Thanks for sharing!
A float like 0.01 is valid in ahk in these forms: +00.01 / +0.01 / .01 / +.01 / .010
ZTrim() calls Abs() to remove the redundant + sign, adds a leading zero for values like .01

ZTrim() will return 0 when param is either blank or invalid. This may or may not be desirable.
FanaticGuru
Posts: 1380
Joined: 30 Sep 2013, 22:25

### Re: ZTrim() : Remove redundant leading/trailing zeroes from a number

It would seem that a simple Format will handle most of what is needed.

Code: Select all

``````ZZTrim(N := "")
{
return Format("{1:g}", N)
}

;---------------------------------------------------------------------------------
; Example:
MsgBox % ( A := 1.234000    ) "`t=`t" ZZTrim( A ) "`n"
. ( A := 00.00100    ) "`t=`t" ZZTrim( A ) "`n"
. ( A := -123.010    ) "`t=`t" ZZTrim( A ) "`n"
. ( A := -.212       ) "`t=`t" ZZTrim( A ) "`n"
. ( A := "+001.100" ) "`t=`t" ZZTrim( A ) "`n"
. ( A := "1.12300 " ) "`t=`t" ZZTrim( A ) "`n"
. ( A := 100.00      ) "`t=`t" ZZTrim( A ) "`n"
. ( A := 100         ) "`t=`t" ZZTrim( A ) "`n"

``````
This expects an actually number recognized by AHK with no spaces, dollar signs, or reversed comma and decimal signs.

No script is going to be able to handle reversed comma and decimals without some kind of assumptions or additional information. Is 1,234 a number less than 2 or more than a 1000?

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts

AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon

[Function] Timer - Create and Manage Timers