Перетворення символу у верхній регістр


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? Це допоможе майбутнім пошуковцям.
charles-allen

Відповіді:


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     |
------------------------------------------

Візьмемо приклад малого lдо Lперетворення:

Двійкова операція І: (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нижньої літери. В іншому випадку, якщо символ уже є нижчим регістром, ваш код перетворить його на великі регістри
Стівен Юе

18

Погляньте на java.lang.Characterклас, він надає багато корисних методів для перетворення або тестування символів.


1
+1 Мені подобаються відповіді, які постачальники, користувач з посиланням на них, шукають відповіді
Ентоні Форлоні

2
-1, якщо ми перетягуємо мережу для студентів, ми вилучаємо одну з основних переваг SO. Не витрачаючи непомірну кількість часу, переслідуючи вкладені посилання людей через непрацюючі посилання.
ebt


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

1
Чи можете ви пояснити свою відповідь?
звуки likeodd

first.substring (0,1) отримає підстроку, що має індекс 0 рядка, а потім застосовує методUUperCase до того рядка, який дасть вам перший символ у цьому рядку як верхній регістр
Ліхіт Кумар,

4

Оскільки ви знаєте, що символи є малими, ви можете відняти відповідне значення ASCII, щоб зробити їх великими:

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

Ось таблиця ASCII для довідки


4
Це працює, лише якщо рядок складається виключно з символів ASCII. Такі мови, як французька, грецька, іспанська, турецька тощо, мають символи, що не належать до ASCII, з верхньою / нижньою формами. Такий підхід не спрацював би у цих випадках ...
Mike Laren

На насправді це основний підхід робить роботу для більшості символів загальної не-ASCII французькою, іспанською, німецькою ... наприклад é à ö û ñ... Так що, якщо ОП знає , що він буде мати справу тільки з такими персонажами, він може дотримуватися цього методу заради простоти та продуктивності.
Себастьян

1
Робити розрахунки з персонажами, щоб змінити регістр - одна з найгірших звичок, і тому не 21 століття! Існує більше, ніж ascii chars!
Флойд,

2

Якщо ви включите у свій проект jar apache commons lang, то найпростішим рішенням буде зробити:

WordUtils.capitalize(Name)

дбає про всю брудну роботу за вас. Дивіться тут javadoc

Крім того, у вас також є метод capitalizeFully (String), який також зменшує регістр решти символів.


Посилання ви надали дає помилку 404 !!!! ти можеш це виправити ??
Вісрут

2

Ви можете застосувати .toUpperCase () безпосередньо до рядкових змінних або як атрибут до текстових полів. Приклад: -

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 ();

Звичайно, варто також змінити його назву.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.