Преобразование символа в верхний регистр

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 в верхний регистр.


person shep    schedule 12.09.2010    source источник
comment
какую часть ответов на предыдущий вопрос вы не поняли? Мой ответ там содержит ответ на этот вопрос.   -  person Bozho    schedule 13.09.2010
comment
@shep - Можете ли вы принять ответ BalusC? Это поможет будущим искателям.   -  person charles-allen    schedule 09.10.2017


Ответы (9)


Вы можете использовать Character#toUpperCase() для этого.

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

Однако у него есть некоторые ограничения, поскольку мир знает гораздо больше символов, чем когда-либо может поместиться в 16-битном диапазоне char. См. также следующий отрывок из javadoc:

Примечание. Этот метод не может обрабатывать дополнительные символы. Для поддержки всех символов Unicode, включая дополнительные символы, используйте ссылку toUpperCase(int).

person BalusC    schedule 12.09.2010

Вместо использования существующих утилит вы можете попробовать преобразование ниже с использованием логической операции:

В верхний регистр:

 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
person Rahul Sharma    schedule 01.08.2016
comment
Честно говоря, я в шоке, что у этого есть 7 голосов. Хотя я приветствую умный подход, умный подход редко приводит к написанию кода, который можно поддерживать, особенно когда он используется вместо встроенного метода, такого как Character.toUpperCase(). Любые пользователи этого должны понимать, что он не будет обрабатывать ничего, кроме ASCII. - person Adam Hewitt; 06.09.2017
comment
@AdamHewitt этот подход работает и с символами, отличными от ASCII, например. «250», однако несколько символов, отличных от ASCII, не дадут ожидаемых результатов. Вы правы, что пользователи должны понимать правильное использование этого подхода, и его следует использовать в основном для английских алфавитов. - person Rahul Sharma; 06.09.2017
comment
Я думаю, что это должно быть c | 0x20 вместо c ^ 0x20 для нижнего регистра. В противном случае, если символ уже в нижнем регистре, ваш код преобразует его в верхний регистр. - person Steven Yue; 16.02.2018

Взгляните на класс java.lang.Character, он предоставляет множество полезных методов для преобразования или проверки символов.

person Andreas Dolk    schedule 12.09.2010
comment
+1 Мне нравятся ответы, которые дают пользователю ссылку на поиск ответа - person Anthony Forloney; 13.09.2010
comment
-1, если мы таскаем для студентов, мы убираем одно из основных преимуществ ТАК. Не тратить чрезмерное количество времени на отслеживание вложенных ссылок людей по неработающим ссылкам. - person ebt; 18.01.2014

Поскольку вы знаете, что символы в нижнем регистре, вы можете вычесть соответствующее значение ASCII, чтобы сделать их прописными:

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

Вот таблица ASCII для справки.

person Burrito    schedule 08.02.2015
comment
Это работает, только если строка состоит исключительно из символов ASCII. Такие языки, как французский, греческий, испанский, турецкий и т. д., имеют символы, отличные от ASCII, с заглавными/нижними формами. В таких случаях этот подход не сработает... - person Mike Laren; 08.02.2015
comment
На самом деле этот базовый подход действительно работает для наиболее распространенных символов, отличных от ASCII, во французском, испанском, немецком... например. é à ö û ñ ... Итак, если ОП знает, что ему придется иметь дело только с такими персонажами, он может придерживаться этого метода ради простоты и производительности. - person Sébastien; 13.10.2015
comment
Делать вычисления с символами для смены регистра — одна из самых дурных привычек, и уж не 21 век! Там больше, чем символы ascii! - person Floyd; 17.12.2015

Если вы включаете в свой проект банку apache commons lang, самым простым решением будет:

WordUtils.capitalize(Name)

сделает за вас всю грязную работу. См. javadoc здесь

В качестве альтернативы у вас также есть метод capitalizeFully(String), который также прописывает остальные символы.

person Asaf    schedule 12.09.2010
comment
ссылка, которую вы предоставили, дает ошибку 404!!!! можешь исправить?? - person Visruth; 05.07.2013

Вы можете применить .toUpperCase() непосредственно к строковым переменным или как атрибут к текстовым полям. Бывший: -

String str;
TextView txt;

str.toUpperCase();// will change it to all upper case OR
txt.append(str.toUpperCase());
txt.setText(str.toUpperCase());
person امون بسام    schedule 25.04.2016

Я думаю, вы пытаетесь использовать первый и последний символ каждого слова в предложении с пробелом в качестве разделителя.

Можно сделать через 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();
}
person Praveen    schedule 07.12.2017

Самое простое решение для вашего случая - изменить первую строку, пусть она делает прямо противоположное:

String lower = Name.toUpperCase ();

Конечно, стоит изменить и его название.

person Roman    schedule 12.09.2010

person    schedule
comment
Можете ли вы объяснить свой ответ? - person soundslikeodd; 08.01.2017
comment
first.substring(0,1) извлечет подстроку с индексом строки 0, а затем применит метод toUpperCase к этой строке, который даст вам первый символ в этой строке в верхнем регистре. - person Likhith Kumar; 08.01.2017