如何将首字母大写显示?

6

我在数据库中有名字和姓氏的信息,这些信息可能以JOHN DOE、john DOE或JoHN dOE的形式存储,但最终我想要将其显示为John Doe。

其中,名字为John,姓氏为Doe。

7个回答

21

请注意,还有其他的大写格式,例如John McDoe,John D'Oe,John de O和John van den Doe。


你还可以有像John McDoe和John MacDoe这样的变体。 - ShoeLace
了解不同的大小写格式是一个很好的观点,但你没有提供任何应对建议? - Scott Saad
通常我会保留用户输入的大小写,然后添加ucwords...否则,如果有人输入缩写,你就会自食其果。 - Cory Dee
2
@Scott:显然,微妙的建议是“不要这样做!” - Milen A. Radev
1
我同意Cory的观点,试图将这种逻辑构建到软件中是不合理的,因为即使是在姓氏完全相同的两个人可能会以不同的方式大写它,这也是不确定的。把它留给用户,并确保您保持他们的大写首选项。 - Wedge
没错,不要去动名字。名字很复杂。(注意三个苏格兰姓氏 McDonald、MacDonald 和 Macdonald。) - TRiG

14

看到它被标记为 PHP:
要么

string ucfirst ( string $str );

将第一个单词的首字母大写

或者

string ucwords ( string $str );

将每个单词的首字母都大写

您可能想结合使用这些方法:

string strtolower ( string $str );

将所有名称规范化为小写。


13

我不确定您希望在哪里以及如何显示它,但如果是在网页上,您可以尝试使用CSS来更改其显示方式。尝试添加:

text-transform:capitalize;

根据相关规则,如下所示:
.name { text-transform:capitalize;}

如果你把名字放在一个class为"name"的div或span中,这当然不会改变数据库的条目,但我不确定哪种方式更可取。

Dugg,非常出色的建议,不会影响实际数据。 - questzen

3

以下是来自php.net的示例:

$bar = 'HELLO WORLD!';
$bar = ucfirst($bar);             // HELLO WORLD!
$bar = ucfirst(strtolower($bar)); // Hello world!

记住有关本地化的注意事项...

1

对于简单的名称,这将起作用。请注意特殊情况(如下面示例中的“Ronald McDonald”)。

在SQL Server中:

SELECT  --step 2: combine broken parts into a final name
  NAME_PARTS.FNAME_INITIAL + NAME_PARTS.REST_OF_FNAME AS FNAME
 ,NAME_PARTS.LNAME_INITIAL + NAME_PARTS.REST_OF_LNAME AS LNAME
FROM
  (     --step 1: break name into 1st letter and "everything else"
  SELECT
    UPPER(SUBSTRING(TEST.FNAME,1,1)) AS FNAME_INITIAL
   ,UPPER(SUBSTRING(TEST.LNAME,1,1)) AS LNAME_INITIAL
   ,LOWER(SUBSTRING(TEST.FNAME,2,LEN(TEST.FNAME))) AS REST_OF_FNAME
   ,LOWER(SUBSTRING(TEST.LNAME,2,LEN(TEST.LNAME))) AS REST_OF_LNAME
  FROM
    (   --step 0: generate some test data
          SELECT 'john' AS FNAME, 'doe' as LNAME
    UNION SELECT 'SUZY', 'SMITH'
    UNION SELECT 'bIlLy', 'BOb'
    UNION SELECT 'RoNALD', 'McDonald'
    UNION SELECT 'Edward', NULL
    UNION SELECT NULL, 'Jones'
    ) TEST
  ) NAME_PARTS

在Oracle中

SELECT  --step 2: combine broken parts into a final name
  NAME_PARTS.FNAME_INITIAL || NAME_PARTS.REST_OF_FNAME AS FNAME
 ,NAME_PARTS.LNAME_INITIAL || NAME_PARTS.REST_OF_LNAME AS LNAME
FROM
  (     --step 1: break name into 1st letter and "everything else"
  SELECT
    UPPER(SUBSTR(TEST.FNAME,1,1)) AS FNAME_INITIAL
   ,UPPER(SUBSTR(TEST.LNAME,1,1)) AS LNAME_INITIAL
   ,LOWER(SUBSTR(TEST.FNAME,2,LENGTH(TEST.FNAME))) AS REST_OF_FNAME
   ,LOWER(SUBSTR(TEST.LNAME,2,LENGTH(TEST.LNAME))) AS REST_OF_LNAME
  FROM
    (   --step 0: generate some test data
          SELECT 'john' AS FNAME, 'doe' as LNAME FROM DUAL
    UNION SELECT 'SUZY', 'SMITH' FROM DUAL
    UNION SELECT 'bIlLy', 'BOb' FROM DUAL
    UNION SELECT 'RoNALD', 'McDonald' FROM DUAL
    UNION SELECT 'Edward', NULL FROM DUAL
    UNION SELECT NULL, 'Jones' FROM DUAL
    ) TEST
  ) NAME_PARTS

1

结合 PHP 简写函数 strtolowerucwords 可以解决您的问题:

function ucname($f, $l)
{
    return ucwords(strtolower($f." ".$l));
}
echo ucname($fname, $lname);

另外需要注意的是,您可以在许多不同的阶段进行数据美化:

  1. 在您的应用程序中插入之前
  2. 使用 SQL 插入/更新查询中的字符串函数进行插入期间
  3. 使用 SQL 选择查询中的字符串函数进行提取期间
  4. 在您的应用程序中提取后

-1
将名称更改为小写,然后将 'A' - 'a' 添加到 fname 和 lname 的第一个字母。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接