将char转换为大写


75
String lower = Name.toLowerCase();
int a = Name.indexOf(" ",0);
String first = lower.substring(0, a);
String last = lower.substring(a+1);
char f = first.charAt(0);
char l = last.charAt(0);
System.out.println(l);

我如何将F和L变量转换为大写。


您不了解上一个问题的答案的哪一部分?我在那里的答案包含了对这个问题的答案。
博佐

@shep-您可以接受BalusC的回答吗?它将对将来的搜索者有所帮助。
查尔斯·艾伦

Answers:


142

您可以Character#toUpperCase()为此使用。

char fUpper = Character.toUpperCase(f);
char lUpper = Character.toUpperCase(l);

但是它有一些局限性,因为世界意识到比16位char范围内的字符更多的字符。另请参见以下javadoc摘录:

注意:此方法无法处理 补充字符。若要支持所有Unicode字符,包括补充字符,请使用toUpperCase(int)方法。


32

除了使用现有的实用程序,您还可以尝试以下使用布尔运算的转换:

大写:

 char upperChar = 'l' & 0x5f

小写:

   char lowerChar = 'L' ^ 0x20

这个怎么运作:

二进制,十六进制和十进制表:

------------------------------------------
| Binary   |   Hexadecimal     | Decimal |
-----------------------------------------
| 1011111  |    0x5f           |  95     |
------------------------------------------
| 100000   |    0x20           |  32     |
------------------------------------------

让我们举一个小lL转化的例子:

二进制AND运算: (l & 0x5f)

l字符具有ASCII 108,01101100是二进制表示形式。

   1101100
&  1011111
-----------
   1001100 = 76 in decimal which is **ASCII** code of L

同样要L进行l转换:

二进制XOR操作: (L ^ 0x20)

   1001100
^  0100000
-----------
   1101100 = 108 in decimal which is **ASCII** code of l

11
老实说,我有7票,对此我感到震惊。尽管我赞扬这种聪明的方法,但聪明的做法很少会导致代码可维护,尤其是在代替诸如的内置方法使用时Character.toUpperCase()。任何对此的用户都应该理解,它将不会处理任何非ASCII的内容。
亚当·休伊特

1
@AdamHewitt这种方法也可以与非ASCII字符一起使用,例如'250',但是,很少的非ASCII字符不会给出预期的结果。用于英文字母。
拉胡尔·夏尔马

1
我认为应该c | 0x20代替c ^ 0x20小写字母。否则,如果字符已经是小写字母,则您的代码会将其转换为大写字母
Steven Yue

18

看一看java.lang.Character该类,它提供了许多有用的方法来转换或测试字符。


1
+1我喜欢为用户提供参考的答案
Anthony Forloney 2010年

2
-1,如果我们为学生提供拉网,那么我们将消除SO的主要好处之一。人们在断开的链接上嵌套引用后,不会花费过多的时间。
ebt


5
System.out.println(first.substring(0,1).toUpperCase()); 
System.out.println(last.substring(0,1).toUpperCase());

1
你能解释你的答案吗?
听起来像是

first.substring(0,1)将检索位于字符串0索引处的子字符串,然后将toUpperCase方法应用于该字符串,这将为您提供该字符串中的第一个字符为大写字母
Likhith Kumar

4

由于您知道字符是小写的,因此可以减去相应的ASCII值以使其大写:

char a = 'a';
a -= 32;
System.out.println("a is " + a); //a is A

这是一个ASCII表供参考


4
仅当字符串仅由ASCII字符组成时,此方法才有效。诸如法语,希腊语,西班牙语,土耳其语等语言都具有非ASCII字符,并具有上/下形式。这种方法在那种情况下行不通...
Mike Laren 2015年

实际上,这种基本方法确实适用于法语,西班牙语,德语中最常见的非ASCII字符……例如é à ö û ñ……因此,如果OP知道他只需要处理此类字符,则可以坚持使用此方法为了简单和性能。
塞巴斯蒂安

1
用字符进行计算以更改大小写是最坏的习惯之一,而不是21世纪!有超过ASCII字符!
弗洛伊德(Floyd)2015年

2

如果您在项目中包含apache commons lang jar,那么最简单的解决方案是:

WordUtils.capitalize(Name)

为您处理所有肮脏的工作。在这里查看javadoc

另外,您还有一个capitalizeFully(String)方法,该方法还可以将其余字符都小写。


您提供的链接显示404错误!!!!你能纠正吗?
Visruth

2

您可以将.toUpperCase()直接应用于String变量,也可以将其用作文本字段的属性。例如:-

String str;
TextView txt;

str.toUpperCase();// will change it to all upper case OR
txt.append(str.toUpperCase());
txt.setText(str.toUpperCase());

0

我认为您正在尝试使用空格作为定界符来大写句子中每个单词的第一个和最后一个字符。

可以通过StringBuffer以下方式完成:

public static String toFirstLastCharUpperAll(String string){
    StringBuffer sb=new StringBuffer(string);
        for(int i=0;i<sb.length();i++)
            if(i==0 || sb.charAt(i-1)==' ' //for first character of string/each word
                || i==sb.length()-1 || sb.charAt(i+1)==' ') //for last character of string/each word
                sb.setCharAt(i, Character.toUpperCase(sb.charAt(i)));
     return sb.toString();
}

-1

针对您的情况最简单的解决方案-更改第一行,让它做相反的事情:

String lower = Name.toUpperCase ();

当然,也有必要更改其名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.