Format a number to two decimals

Started by Jay on 13-May-2021/14:41:13-7:00
Hello, How do I format a number to two decimals? I really looked through all the documentation but I cannot find anything about it. For example displaying 12.1 as 12.10, or writing it to a file as 12.10. Or 3 as 3.00. How would I be able to do that? Thank you!
I remember struggling with that in the past, too. Unfortunately, it's different across REBOL versions. In REBOL 3, you would probably use the FORMAT dialect, which has a /PAD refinement. But I never used it, so I know very little about it. It was made because REBOL 2 has little for it, so you usually have to cook something up yourself there.
Oh that's a shame. When I open rebol.exe, it shows REBOL/View 2.7.8.3.1, so I guess that FORMAT command is not available to me. Is there a way to determine how many decimals a variable has? Because then you can turn it into a string and add zeros at the end.
So I had the idea to use remainder (//) to determine the number of decimals, then turn it into a string and add zeros accordingly. But since I want to format the number into 2 decimals, I decided to use the following (ugly, but functional) code: --- number: "2.1" number: to-money number number: to-string number remove/part number 1 alert number --- Works really nice!
Found two applicable money functions of mine: round-money: func [ ; To two decimal places -money [money! decimal! integer!] ][ -(to-integer (either money? money [money/2] [money]) * 100 + (0.5 * sign? money)) / 100 ] form-money: func [ -money [money! decimal! integer!] ][ -if money? money [money: money/2] ; For R2 -rejoin [ --either negative? money [#"-"] [""] ; Optionally different representation --absolute to-integer money --#"," ; Dutch! --pad (to-integer (absolute money) * 100 + 0.5) // 100 2 ; Cents -] ] Of course, if you're in an anglo-saxon country, you can replace the comma with a dot.
It uses PAD: pad: func ["Convert to string and pad to specified width." -item -width [integer!] -/with --padding [char!] -/left -/right -/local num? ][-; FIXME: left-zero-padding of negative numbers, right-zero-padding of integers -num?: number? item -unless with [padding: either num? [#"0"] [#" "]] -item: form item -head insert/dup --either any [all [num? not right] left] [item] [tail item] --padding --width - length? item ]
>> to2dec: func [i [decimal! integer!]][ head insert back back tail form to integer! i * 100 "."] == #[action! {to2dec} [i]] >> to2dec 12.1 == "12.10" >> to2dec 3 == "3.00"

Reply