[英]Converting strings in F#
我正在尝试转换如下文件名:
ten_of_clubs.png
至
10_of_clubs.png
但是,我不喜欢自己的实现:
let getFile (card: Card Option) =
let fileName =
match card with
| Some card -> (getUnionTypeName card.Face + "_of_" + getUnionTypeName card.Suit + ".png").ToLower()
| None -> ""
let delimitedName = fileName.Split '_'
let currentFace = delimitedName.[0]
let updatedFace =
match currentFace with
| "two" -> "2"
| "three" -> "3"
| "four" -> "4"
| "five" -> "5"
| "six" -> "6"
| "seven" -> "7"
| "eight" -> "8"
| "nine" -> "9"
| "ten" -> "10"
| _ -> currentFace
updatedFace + "_" + delimitedName.[1] + "_" + delimitedName.[2]
在F#中,如何仅更改字符串的第一个元素而不引用所有元素?
例:
updatedFace + "_" + delimitedName.[1] + "_" + delimitedName.[2]
至
updatedFace + "_" + delimitedName.[1..]
没有理由先构造一个格式化的字符串,然后将其拆分,最后创建一个新的格式化的字符串。
假设您的目的是在None
情况下返回空字符串,则可以执行以下操作:
let getFile card =
let digitize candidate =
match candidate with
| "Two" -> "2"
| "Three" -> "3"
| "Four" -> "4"
| "Five" -> "5"
| "Six" -> "6"
| "Seven" -> "7"
| "Eight" -> "8"
| "Nine" -> "9"
| "Ten" -> "10"
| _ -> candidate
match card with
| Some c ->
let face = c.Face |> string |> digitize
let suit = c.Suit |> string
sprintf "%s_of_%s.png" face suit
| None -> ""
在这里,我假设Face
和Suit
类型覆盖了ToString
而不是依赖我不知道的名为getUnionTypeName
的函数。 这使您可以使用内置的函数string
(仅调用ToString ()
)。
临时测试:
> Some { Face = Ten; Suit = Clubs } |> getFile;;
val it : string = "10_of_Clubs.png"
> Some { Face = Jack; Suit = Clubs } |> getFile;;
val it : string = "Jack_of_Clubs.png"
> None |> getFile;;
val it : string = ""
该digitize
功能看起来像通用功能的候选者,我想知道BCL的全球化名称空间中是否还没有类似的东西……否则,我确定有成百上千的NuGet软件包那里实现了这样的功能...
事实证明, 已经没有数百个NuGet软件包已经执行此操作,因此我创建了一个名为Numsense的软件包 。 使用它,您可以将getFile
函数简化为:
open Ploeh.Numsense
let getFile card =
let digitize candidate =
match Numeral.tryParseEnglish candidate with
| Some i -> string i
| None -> candidate
match card with
| Some c ->
let face = c.Face |> string |> digitize
let suit = c.Suit |> string
sprintf "%s_of_%s.png" face suit
| None -> ""
用_分割字符串后,得到一个数组。 数组是可变的Collection。 您可以先通过函数更改,然后再次由_串联。
let parts = myString.Split [|'_'|]
parts.[0] <- toNumber parts.[0]
String.concat "_" parts
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.