我正在尝试将Excel工作表中的列转换为我的F#应用程序中的浮点数。问题是我不知道货币的供应格式。这可以手动输入,带或不带符号,当然也可以。而且,符号总是一团糟。
是否有任何“简短而又甜蜜”的方法可以将实际浮点值看似无关紧要的数组进行战争,以后可以将某些算术打印为货币?
我遇到过的一个问题: 当Excel中的列标记为 Number 时,600.00将通过互操作库导出为600; 534.20将以534.2的形式出口 一个简单的解析。符号是不够的。
未显示的符号是Excel,将通过互操作库导出为?(后面有空格)。
这些选项并非如此:
let ParseFloat1 (o:obj) =
float (o.ToString())
let parseFloat2 (o:obj) =
float (System.Single.Parse(o.ToString()))
在这些尝试之后,我发疯了并开始 russamafuzzin'解决方案,甚至连一条坏主意的龙都没有用过:
let ParseFloat o =
// ugly
let mutable _string = o.ToString()
// because of the weird "lets leave trailing zero's off behavior
let changeString (s:string) =
match s.LastIndexOf "." with
| 0 | -1 -> s + "00"
| 1 -> s + "0"
| _ -> s
_string <- changeString _string
let characters = _string.ToCharArray()
// remove all the non numbers from the string
let rec parse source dest =
match source with
| h::t ->
match h with
| '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0' -> parse t (dest + h.ToString())
| _ -> parse t dest
| _ -> dest
let _float = parse (Array.toList characters) ""
let result = (float (System.Single.Parse(_float))) / (float 100)
result
我真的希望有人可以帮助我,因为这让我发疯。提前谢谢。
编辑(16-11-2015):
有效评论后的更多信息,我感谢所有的帮助和评论。
我已将问题分解为更多“部分”,因此我为此应用程序引入了一些约定。我认为这个问题没有解决方案所以我需要加入一些限制并希望最好......
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
获取小数符号,并确保Excel工作表中的列的类型为Number,添加此类型的列并在需要时重新保存。CultureInfo
相同。扩展Petr的答案:
let ParseFloat o =
let decimalSeparator = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
let newv = String((o.ToString()) |> Seq.filter (fun c -> Char.IsNumber c || c = decimalSeparator) |> Array.ofSeq )
let rslt = match Double.TryParse(newv) with
| true, number -> (float number)
| false, _ -> throw "Cannot parse the number"
rslt
答案 0 :(得分:1)
这样的东西?
open System
let value = "£1,097."
let newv = String(value |> Seq.filter (fun c -> Char.IsNumber c || c = '.') |> Array.ofSeq )
let rslt = match Double.TryParse(newv) with
| true, number -> printfn"Converted '%s' to %.2f" value number
| false, _ -> printfn "Unable to convert '%s'" value
结果:
转换'£1,097。'到1097.00