Home   Archive   Permalink



Format a number to two decimals

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!


posted by:   Jay     13-May-2021/14:41:13-7:00



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.

posted by:   Kaj     13-May-2021/16:31:18-7:00



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.


posted by:   Jay     13-May-2021/17:30:14-7:00



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!


posted by:   Jay     14-May-2021/2:55:30-7:00



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.

posted by:   Kaj     6-Jun-2021/7:20:23-7:00



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
]


posted by:   Kaj     6-Jun-2021/7:23:31-7:00



>> 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"


posted by:   Graham     25-Dec-2021/15:03:53-8:00