F#从Excel中转换货币
我试图将Excel工作表中的一列转换为我的F#应用程序中的一个浮点数。 问题是我不知道货币是以何种格式提供的。 这可以手动键入,有或没有符号,当然是。 而且,符号总是一团糟。
有没有什么“短而甜”的方法来打击一个实际浮点值的可能性是不一致的,这些浮点值在一些算术之后可以打印为货币?
我遇到的一个侧面问题:当Excel中的一列被标记为数字 600.00时,将通过互操作库导出为600; 534.20将作为534.2导出一个简单的parsing。 符号是不够的。
不显示的符号是Excel将通过互操作库导出为一个? (随着空间)。
这些选项不工作:
let ParseFloat1 (o:obj) = float (o.ToString()) let parseFloat2 (o:obj) = float (System.Single.Parse(o.ToString()))
经过这些努力,我只是疯了,开始russamafuzzin的解决scheme,甚至不是这个坏主意的龙工作:
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) :
有效评论后的更多信息,我感谢所有的帮助和意见。
我已经把问题分解成更多的“部分”,所以我为这个应用程序引入了一些约定。 我认为这个问题没有解决办法,所以我需要join一些限制,希望最好的…
- 我从
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
获取小数点符号,并确保Excel表格中的列的types是Number,添加此types的列并在需要时重新保存。 - 我从string中删除所有其他符号,只留下分隔符。 (就像答案Petr)
- 在相同的上下文中运行Excel,并确保
CultureInfo
是相同的。
为了扩大彼得的答案:
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
像这样的东西?
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