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