jbe/bsw@0: --[[-- jbe/bsw@0: text = -- text with the value formatted as a percentage jbe/bsw@0: format.percentage( jbe/bsw@0: value, -- a number, a fraction or nil jbe/bsw@0: { jbe/bsw@0: nil_as = nil_text -- text to be returned for a nil value jbe/bsw@0: digits = digits, -- digits before decimal point (of the percentage value) jbe/bsw@0: precision = precision, -- digits after decimal point (of the percentage value) jbe/bsw@0: decimal_shift = decimal_shift -- divide the value by 10^decimal_shift (setting true uses precision + 2) jbe/bsw@0: } jbe/bsw@0: ) jbe/bsw@0: jbe/bsw@0: Formats a number or fraction as a percentage. jbe/bsw@0: jbe/bsw@0: --]]-- jbe/bsw@0: jbe/bsw@0: function format.percentage(value, options) jbe/bsw@0: local options = table.new(options) jbe/bsw@0: local f jbe/bsw@0: if value == nil then jbe/bsw@0: return options.nil_as or "" jbe/bsw@0: elseif atom.has_type(value, atom.number) then jbe/bsw@0: f = value jbe/bsw@0: elseif atom.has_type(value, atom.fraction) then jbe/bsw@0: f = value.float jbe/bsw@0: else jbe/bsw@0: error("Value passed to format.percentage(...) is neither a number nor a fraction nor nil.") jbe/bsw@0: end jbe/bsw@0: options.precision = options.precision or 0 jbe/bsw@0: if options.decimal_shift == true then jbe/bsw@0: options.decimal_shift = options.precision + 2 jbe/bsw@0: end jbe/bsw@0: local suffix = options.hide_unit and "" or " %" jbe/bsw@0: return format.decimal(f * 100, options) .. suffix jbe/bsw@0: end