String.capitalize/2
函数“将给定字符串中的第一个字符转换为大写,将其余字符转换为小写”。将第一个字符大写并保持其余字符不变不是更直观吗?也许我缺少一些推理?
当前的实施结果为
the local ATM
-> The local Atm
, forgotten PIN
-> Forgotten Pin
等
这是一个解决方案,不需要调用未记录的特定实现
String.Casing
.
with <<c :: utf8, rest :: binary>> <- "the local ATM",
do: String.upcase(<<c>>) <> rest
#⇒ "The local ATM"
以上内容也适用于 unicode 字符(组合和分解):
with <<c :: utf8, rest :: binary>> <- "über BVG",
do: String.upcase(<<c>>) <> rest
#⇒ "Über BVG"
这是需要大写的 elixir api。
def capitalize(string, mode) when is_binary(string) do
{char, rest} = String.Casing.titlecase_once(string, mode)
char <> downcase(rest, mode)
end
如果我们想满足您的要求,即只将第一个字母大写,那么我们可以执行这样的操作。在这里,我们只删除了额外的下套管调用,因此我们只使这段代码在性能方面更加健壮。
def capitalize_only_first(string, mode) when is_binary(string) do
{char, rest} = String.Casing.titlecase_once(string, mode)
char <> rest
end
从性能的角度来看,第二次实施更好。所以,我相信唯一的理由是让长生不老药保留这个
capitalize/2
实现是因为大多数开发人员都希望它以这种方式工作。
这个答案让我对可能绕过它的推理感到好奇。 :)
对于希望在不编写自定义函数的情况下执行此操作的任何人,以下是我在需要时执行此操作的方法:
"the local ATM"
|> String.Casing.titlecase_once(:default)
|> Tuple.to_list
|> Enum.join
JFYI 对于任何谷歌搜索这个:)
更新:不要这样做!根据 https://elixirforum.com/t/string-capitalize-should-have-a-leave-the-rest-of-the-word-alone-option/31095/2?u=slouchpie 这很危险使用
Casing.titlecase_once
对于正在寻找将字符串中的每个单词大写(但找不到)的人。
capitalize_words = fn string ->
String.split(" ")
|> Enum.map(& String.capitalize(&1)) # or Enum.map(& (String.capitalize/1))
|> Enum.join(" ")
end
结果:
iex> capitalize_words.("hello to every human being!")
"Hello To Every Human Being!"