webmcp
annotate framework/env/parse/decimal.lua @ 3:795b764629ca
Version 1.0.3
Important bugfix related to internal forwards (Bug was introduced by the restriction of views with underscore prefix in Version 1.0.2)
Important bugfix related to internal forwards (Bug was introduced by the restriction of views with underscore prefix in Version 1.0.2)
author | jbe |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | 9fdfb27f8e67 |
children |
rev | line source |
---|---|
jbe/bsw@0 | 1 local digit_set = { |
jbe/bsw@0 | 2 ["0"] = true, ["1"] = true, ["2"] = true, ["3"] = true, ["4"] = true, |
jbe/bsw@0 | 3 ["5"] = true, ["6"] = true, ["7"] = true, ["8"] = true, ["9"] = true |
jbe/bsw@0 | 4 } |
jbe/bsw@0 | 5 |
jbe/bsw@0 | 6 function parse.decimal(str, dest_type, options) |
jbe/bsw@0 | 7 local str = parse._pre_fold(str) |
jbe/bsw@0 | 8 local dest_type = dest_type or atom.number |
jbe/bsw@0 | 9 local options = options or {} |
jbe/bsw@0 | 10 if str == "" then |
jbe/bsw@0 | 11 return nil |
jbe/bsw@0 | 12 else |
jbe/bsw@0 | 13 local decimal_shift = options.decimal_shift or 0 |
jbe/bsw@0 | 14 if decimal_shift == true then |
jbe/bsw@0 | 15 decimal_shift = options.precision |
jbe/bsw@0 | 16 end |
jbe/bsw@0 | 17 local decimal_point = locale.get("decimal_point") or "." |
jbe/bsw@0 | 18 local negative = nil |
jbe/bsw@0 | 19 local int = 0 |
jbe/bsw@0 | 20 local frac = 0 |
jbe/bsw@0 | 21 local precision = 0 |
jbe/bsw@0 | 22 local after_point = false |
jbe/bsw@0 | 23 for char in string.gmatch(str, ".") do |
jbe/bsw@0 | 24 local skip = false |
jbe/bsw@0 | 25 if negative == nil then |
jbe/bsw@0 | 26 if char == "+" then |
jbe/bsw@0 | 27 negative = false |
jbe/bsw@0 | 28 skip = true |
jbe/bsw@0 | 29 elseif char == "-" then -- real minus sign already replaced by _pre_fold |
jbe/bsw@0 | 30 negative = true |
jbe/bsw@0 | 31 skip = true |
jbe/bsw@0 | 32 end |
jbe/bsw@0 | 33 end |
jbe/bsw@0 | 34 if not skip then |
jbe/bsw@0 | 35 if digit_set[char] then |
jbe/bsw@0 | 36 if after_point then |
jbe/bsw@0 | 37 if decimal_shift > 0 then |
jbe/bsw@0 | 38 int = 10 * int + tonumber(char) |
jbe/bsw@0 | 39 decimal_shift = decimal_shift - 1 |
jbe/bsw@0 | 40 else |
jbe/bsw@0 | 41 frac = 10 * frac + tonumber(char) |
jbe/bsw@0 | 42 precision = precision + 1 |
jbe/bsw@0 | 43 end |
jbe/bsw@0 | 44 else |
jbe/bsw@0 | 45 int = 10 * int + tonumber(char) |
jbe/bsw@0 | 46 end |
jbe/bsw@0 | 47 elseif char == decimal_point then |
jbe/bsw@0 | 48 if after_point then |
jbe/bsw@0 | 49 return dest_type.invalid |
jbe/bsw@0 | 50 else |
jbe/bsw@0 | 51 after_point = true |
jbe/bsw@0 | 52 end |
jbe/bsw@0 | 53 elseif char ~= " " then -- TODO: ignore thousand seperator too, when supported by format.decimal |
jbe/bsw@0 | 54 return dest_type.invalid |
jbe/bsw@0 | 55 end |
jbe/bsw@0 | 56 end |
jbe/bsw@0 | 57 end |
jbe/bsw@0 | 58 int = int * 10 ^ decimal_shift |
jbe/bsw@0 | 59 if dest_type == atom.number or dest_type == atom.integer then |
jbe/bsw@0 | 60 if dest_type == atom.integer and frac ~= 0 then |
jbe/bsw@0 | 61 return atom.not_a_number |
jbe/bsw@0 | 62 else |
jbe/bsw@0 | 63 local f = int + frac / 10 ^ precision |
jbe/bsw@0 | 64 if negative then |
jbe/bsw@0 | 65 f = -f |
jbe/bsw@0 | 66 end |
jbe/bsw@0 | 67 return f |
jbe/bsw@0 | 68 end |
jbe/bsw@0 | 69 elseif dest_type == atom.fraction then |
jbe/bsw@0 | 70 return atom.fraction(int * 10 ^ precision + frac, 10 ^ precision) |
jbe/bsw@0 | 71 else |
jbe/bsw@0 | 72 error("Missing or invalid destination type for parsing.") |
jbe/bsw@0 | 73 end |
jbe/bsw@0 | 74 end |
jbe/bsw@0 | 75 end |