มีวิธีการในตัวเพื่อแปลงสตริงเป็นรูปแบบ Title Case หรือไม่?
มีวิธีการในตัวเพื่อแปลงสตริงเป็นรูปแบบ Title Case หรือไม่?
คำตอบ:
Apache Commons StringUtils.capitalize ()หรือ Commons Text WordUtils.capitalize ()
เช่นWordUtils.capitalize("i am FINE") = "I Am FINE"
จากWordUtils doc
StringUtils.capitalise()
capitalize()
?
ไม่มีเมธอด Capitalize () หรือ titleCase () ในคลาส String ของ Java คุณมีสองทางเลือก:
StringUtils.capitalize(null) = null
StringUtils.capitalize("") = ""
StringUtils.capitalize("cat") = "Cat"
StringUtils.capitalize("cAt") = "CAt"
StringUtils.capitalize("'cat'") = "'cat'"
public static String toTitleCase(String input) {
StringBuilder titleCase = new StringBuilder(input.length());
boolean nextTitleCase = true;
for (char c : input.toCharArray()) {
if (Character.isSpaceChar(c)) {
nextTitleCase = true;
} else if (nextTitleCase) {
c = Character.toTitleCase(c);
nextTitleCase = false;
}
titleCase.append(c);
}
return titleCase.toString();
}
System.out.println(toTitleCase("string"));
System.out.println(toTitleCase("another string"));
System.out.println(toTitleCase("YET ANOTHER STRING"));
ผลลัพธ์:
สตริง สตริงอื่น อีกอย่างก็เครียด
char[]
ในStringBuilder
ผมขอแนะนำให้ใช้new StringBuilder(input.length())
หากฉันสามารถส่งการแก้ปัญหาของฉัน ...
วิธีการต่อไปนี้ขึ้นอยู่กับวิธีที่ dfa โพสต์ มันทำการเปลี่ยนแปลงที่สำคัญดังต่อไปนี้ (ซึ่งเหมาะกับโซลูชันที่ฉันต้องการในขณะนั้น): มันบังคับให้อักขระทั้งหมดในสตริงอินพุตเป็นตัวพิมพ์เล็กเว้นแต่จะนำหน้าด้วย "ตัวคั่นที่ดำเนินการได้" ในกรณีนี้อักขระจะถูกบังคับให้เป็น ตัวพิมพ์ใหญ่
ข้อ จำกัด ที่สำคัญของกิจวัตรของฉันคือทำให้สมมติฐานว่า "ตัวพิมพ์ใหญ่" ถูกกำหนดไว้อย่างสม่ำเสมอสำหรับทุกภาษาและแสดงโดยรูปแบบกรณีเดียวกับที่ฉันเคยใช้ดังนั้นจึงมีประโยชน์น้อยกว่าโค้ดของ dfa ในแง่นั้น
public static String toDisplayCase(String s) {
final String ACTIONABLE_DELIMITERS = " '-/"; // these cause the character following
// to be capitalized
StringBuilder sb = new StringBuilder();
boolean capNext = true;
for (char c : s.toCharArray()) {
c = (capNext)
? Character.toUpperCase(c)
: Character.toLowerCase(c);
sb.append(c);
capNext = (ACTIONABLE_DELIMITERS.indexOf((int) c) >= 0); // explicit cast not needed
}
return sb.toString();
}
ค่าทดสอบ
สตริง
มาร์ตินโอมาแอลลีย์
จอห์นวิลค์สบูธ
อีกอย่างก็เครียด
เอาท์พุท
สตริง
Martin O'Malley
John Wilkes-Booth
อีกสายหนึ่ง
Character.toTitleCase
แทน
ใช้WordUtils.capitalizeFully ()จาก Apache Commons
WordUtils.capitalizeFully(null) = null
WordUtils.capitalizeFully("") = ""
WordUtils.capitalizeFully("i am FINE") = "I Am Fine"
คุณสามารถใช้ apache commons langs ดังนี้:
WordUtils.capitalizeFully("this is a text to be capitalize")
คุณสามารถค้นหา java doc ได้ที่นี่: WordUtils.capitalizeFully java doc
และหากคุณต้องการลบช่องว่างระหว่างโลกคุณสามารถใช้ได้:
StringUtils.remove(WordUtils.capitalizeFully("this is a text to be capitalize")," ")
คุณสามารถค้นหา java doc สำหรับ String StringUtils.remove java doc
ฉันหวังว่าสิ่งนี้จะช่วยได้
หากคุณต้องการคำตอบที่ถูกต้องตามมาตรฐาน Unicode ล่าสุดคุณควรใช้ icu4j
UCharacter.toTitleCase(Locale.US, "hello world", null, 0);
โปรดทราบว่านี่เป็นเรื่องที่ละเอียดอ่อน
นี่คืออีกสิ่งหนึ่งที่อิงตามคำตอบของ @ dfa และ @ scottb ที่จัดการกับอักขระที่ไม่ใช่ตัวอักษร / ตัวเลข:
public final class TitleCase {
public static String toTitleCase(String input) {
StringBuilder titleCase = new StringBuilder(input.length());
boolean nextTitleCase = true;
for (char c : input.toLowerCase().toCharArray()) {
if (!Character.isLetterOrDigit(c)) {
nextTitleCase = true;
} else if (nextTitleCase) {
c = Character.toTitleCase(c);
nextTitleCase = false;
}
titleCase.append(c);
}
return titleCase.toString();
}
}
ป้อนข้อมูล:
MARY ÄNNO'CONNEŽ-ŠUSLIK
ผลลัพธ์คือ
Mary ÄnnO'Connež-Šuslik
นี่คือสิ่งที่ฉันเขียนเพื่อแปลง snake_case เป็น lowerCamelCase แต่สามารถปรับเปลี่ยนได้ง่ายตามข้อกำหนด
private String convertToLowerCamel(String startingText)
{
String[] parts = startingText.split("_");
return parts[0].toLowerCase() + Arrays.stream(parts)
.skip(1)
.map(part -> part.substring(0, 1).toUpperCase() + part.substring(1).toLowerCase())
.collect(Collectors.joining());
}
ฉันรู้ว่านี่เก่ากว่า แต่ไม่ได้มีคำตอบง่ายๆฉันต้องการวิธีนี้ในการเขียนโค้ดดังนั้นฉันจึงเพิ่มที่นี่ใช้งานง่าย
public static String toTitleCase(String input) {
input = input.toLowerCase();
char c = input.charAt(0);
String s = new String("" + c);
String f = s.toUpperCase();
return f + input.substring(1);
}
ฉันมีปัญหานี้และฉันค้นหามันจากนั้นฉันก็สร้างวิธีการของฉันเองโดยใช้คำหลัก java เพียงแค่ต้องส่งตัวแปร String เป็นพารามิเตอร์และรับเอาต์พุตเป็น String ที่มีชื่อเหมาะสม
public class Main
{
public static void main (String[]args)
{
String st = "pARVeEN sISHOsIYA";
String mainn = getTitleCase (st);
System.out.println (mainn);
}
public static String getTitleCase(String input)
{
StringBuilder titleCase = new StringBuilder (input.length());
boolean hadSpace = false;
for (char c:input.toCharArray ()){
if(Character.isSpaceChar(c)){
hadSpace = true;
titleCase.append (c);
continue;
}
if(hadSpace){
hadSpace = false;
c = Character.toUpperCase(c);
titleCase.append (c);
}else{
c = Character.toLowerCase(c);
titleCase.append (c);
}
}
String temp=titleCase.toString ();
StringBuilder titleCase1 = new StringBuilder (temp.length ());
int num=1;
for (char c:temp.toCharArray ())
{ if(num==1)
c = Character.toUpperCase(c);
titleCase1.append (c);
num=0;
}
return titleCase1.toString ();
}
}
คุณสามารถใช้ได้ดีมาก
org.apache.commons.lang.WordUtils
หรือ
CaseFormat
จาก API ของ Google
ฉันเพิ่งพบปัญหานี้เช่นกันและน่าเสียดายที่มีหลายชื่อที่ขึ้นต้นด้วย Mc และ Mac ฉันลงเอยด้วยการใช้รหัสของ scottb เวอร์ชันที่ฉันเปลี่ยนเพื่อจัดการคำนำหน้าเหล่านี้ดังนั้นในกรณีที่ใครก็ตามต้องการใช้
ยังคงมีกรณีขอบที่พลาดไป แต่สิ่งที่เลวร้ายที่สุดที่อาจเกิดขึ้นได้คือจดหมายจะเป็นตัวพิมพ์เล็กเมื่อควรใช้ตัวพิมพ์ใหญ่
/**
* Get a nicely formatted representation of the name.
* Don't send this the whole name at once, instead send it the components.<br>
* For example: andrew macnamara would be returned as:<br>
* Andrew Macnamara if processed as a single string<br>
* Andrew MacNamara if processed as 2 strings.
* @param name
* @return correctly formatted name
*/
public static String getNameTitleCase (String name) {
final String ACTIONABLE_DELIMITERS = " '-/";
StringBuilder sb = new StringBuilder();
if (name !=null && !name.isEmpty()){
boolean capitaliseNext = true;
for (char c : name.toCharArray()) {
c = (capitaliseNext)?Character.toUpperCase(c):Character.toLowerCase(c);
sb.append(c);
capitaliseNext = (ACTIONABLE_DELIMITERS.indexOf((int) c) >= 0);
}
name = sb.toString();
if (name.startsWith("Mc") && name.length() > 2 ) {
char c = name.charAt(2);
if (ACTIONABLE_DELIMITERS.indexOf((int) c) < 0) {
sb = new StringBuilder();
sb.append (name.substring(0,2));
sb.append (name.substring(2,3).toUpperCase());
sb.append (name.substring(3));
name=sb.toString();
}
} else if (name.startsWith("Mac") && name.length() > 3) {
char c = name.charAt(3);
if (ACTIONABLE_DELIMITERS.indexOf((int) c) < 0) {
sb = new StringBuilder();
sb.append (name.substring(0,3));
sb.append (name.substring(3,4).toUpperCase());
sb.append (name.substring(4));
name=sb.toString();
}
}
}
return name;
}
การแปลงเป็นกรณีชื่อเรื่องที่เหมาะสม:
String s= "ThiS iS SomE Text";
String[] arr = s.split(" ");
s = "";
for (String s1 : arr) {
s += WordUtils.capitalize(s1.toLowerCase()) + " ";
}
s = s.substring(0, s.length() - 1);
ผลลัพธ์: "นี่คือข้อความบางส่วน"
ใช้ Spring's StringUtils
:
org.springframework.util.StringUtils.capitalize(someText);
หากคุณใช้ Spring อยู่แล้วสิ่งนี้จะหลีกเลี่ยงการนำไปใช้ในกรอบงานอื่น
ใช้วิธีนี้เพื่อแปลงสตริงเป็นหัวเรื่องกรณี:
static String toTitleCase(String word) {
return Stream.of(word.split(" "))
.map(w -> w.toUpperCase().charAt(0)+ w.toLowerCase().substring(1))
.reduce((s, s2) -> s + " " + s2).orElse("");
}
ตัวแปลงนี้จะแปลงสตริงใด ๆ ที่มีตัวอักษรอูฐช่องว่างสีขาวตัวเลขและอักขระอื่น ๆ ให้เป็นตัวพิมพ์เล็กที่ถูกสุขอนามัย
/**
* Convert a string to title case in java (with tests).
*
* @author Sudipto Chandra
*/
public abstract class TitleCase {
/**
* Returns the character type. <br>
* <br>
* Digit = 2 <br>
* Lower case alphabet = 0 <br>
* Uppercase case alphabet = 1 <br>
* All else = -1.
*
* @param ch
* @return
*/
private static int getCharType(char ch) {
if (Character.isLowerCase(ch)) {
return 0;
} else if (Character.isUpperCase(ch)) {
return 1;
} else if (Character.isDigit(ch)) {
return 2;
}
return -1;
}
/**
* Converts any given string in camel or snake case to title case.
* <br>
* It uses the method getCharType and ignore any character that falls in
* negative character type category. It separates two alphabets of not-equal
* cases with a space. It accepts numbers and append it to the currently
* running group, and puts a space at the end.
* <br>
* If the result is empty after the operations, original string is returned.
*
* @param text the text to be converted.
* @return a title cased string
*/
public static String titleCase(String text) {
if (text == null || text.length() == 0) {
return text;
}
char[] str = text.toCharArray();
StringBuilder sb = new StringBuilder();
boolean capRepeated = false;
for (int i = 0, prev = -1, next; i < str.length; ++i, prev = next) {
next = getCharType(str[i]);
// trace consecutive capital cases
if (prev == 1 && next == 1) {
capRepeated = true;
} else if (next != 0) {
capRepeated = false;
}
// next is ignorable
if (next == -1) {
// System.out.printf("case 0, %d %d %s\n", prev, next, sb.toString());
continue; // does not append anything
}
// prev and next are of same type
if (prev == next) {
sb.append(str[i]);
// System.out.printf("case 1, %d %d %s\n", prev, next, sb.toString());
continue;
}
// next is not an alphabet
if (next == 2) {
sb.append(str[i]);
// System.out.printf("case 2, %d %d %s\n", prev, next, sb.toString());
continue;
}
// next is an alphabet, prev was not +
// next is uppercase and prev was lowercase
if (prev == -1 || prev == 2 || prev == 0) {
if (sb.length() != 0) {
sb.append(' ');
}
sb.append(Character.toUpperCase(str[i]));
// System.out.printf("case 3, %d %d %s\n", prev, next, sb.toString());
continue;
}
// next is lowercase and prev was uppercase
if (prev == 1) {
if (capRepeated) {
sb.insert(sb.length() - 1, ' ');
capRepeated = false;
}
sb.append(str[i]);
// System.out.printf("case 4, %d %d %s\n", prev, next, sb.toString());
}
}
String output = sb.toString().trim();
output = (output.length() == 0) ? text : output;
//return output;
// Capitalize all words (Optional)
String[] result = output.split(" ");
for (int i = 0; i < result.length; ++i) {
result[i] = result[i].charAt(0) + result[i].substring(1).toLowerCase();
}
output = String.join(" ", result);
return output;
}
/**
* Test method for the titleCase() function.
*/
public static void testTitleCase() {
System.out.println("--------------- Title Case Tests --------------------");
String[][] samples = {
{null, null},
{"", ""},
{"a", "A"},
{"aa", "Aa"},
{"aaa", "Aaa"},
{"aC", "A C"},
{"AC", "Ac"},
{"aCa", "A Ca"},
{"ACa", "A Ca"},
{"aCamel", "A Camel"},
{"anCamel", "An Camel"},
{"CamelCase", "Camel Case"},
{"camelCase", "Camel Case"},
{"snake_case", "Snake Case"},
{"toCamelCaseString", "To Camel Case String"},
{"toCAMELCase", "To Camel Case"},
{"_under_the_scoreCamelWith_", "Under The Score Camel With"},
{"ABDTest", "Abd Test"},
{"title123Case", "Title123 Case"},
{"expect11", "Expect11"},
{"all0verMe3", "All0 Ver Me3"},
{"___", "___"},
{"__a__", "A"},
{"_A_b_c____aa", "A B C Aa"},
{"_get$It132done", "Get It132 Done"},
{"_122_", "122"},
{"_no112", "No112"},
{"Case-13title", "Case13 Title"},
{"-no-allow-", "No Allow"},
{"_paren-_-allow--not!", "Paren Allow Not"},
{"Other.Allow.--False?", "Other Allow False"},
{"$39$ldl%LK3$lk_389$klnsl-32489 3 42034 ", "39 Ldl Lk3 Lk389 Klnsl32489342034"},
{"tHis will BE MY EXAMple", "T His Will Be My Exa Mple"},
{"stripEvery.damn-paren- -_now", "Strip Every Damn Paren Now"},
{"getMe", "Get Me"},
{"whatSthePoint", "What Sthe Point"},
{"n0pe_aLoud", "N0 Pe A Loud"},
{"canHave SpacesThere", "Can Have Spaces There"},
{" why_underScore exists ", "Why Under Score Exists"},
{"small-to-be-seen", "Small To Be Seen"},
{"toCAMELCase", "To Camel Case"},
{"_under_the_scoreCamelWith_", "Under The Score Camel With"},
{"last one onTheList", "Last One On The List"}
};
int pass = 0;
for (String[] inp : samples) {
String out = titleCase(inp[0]);
//String out = WordUtils.capitalizeFully(inp[0]);
System.out.printf("TEST '%s'\nWANTS '%s'\nFOUND '%s'\n", inp[0], inp[1], out);
boolean passed = (out == null ? inp[1] == null : out.equals(inp[1]));
pass += passed ? 1 : 0;
System.out.println(passed ? "-- PASS --" : "!! FAIL !!");
System.out.println();
}
System.out.printf("\n%d Passed, %d Failed.\n", pass, samples.length - pass);
}
public static void main(String[] args) {
// run tests
testTitleCase();
}
}
นี่คือปัจจัยการผลิตบางส่วน:
aCamel
TitleCase
snake_case
fromCamelCASEString
ABCTest
expect11
_paren-_-allow--not!
why_underScore exists
last one onTheList
และผลลัพธ์ของฉัน:
A Camel
Title Case
Snake Case
From Camel Case String
Abc Test
Expect11
Paren Allow Not
Why Under Score Exists
Last One On The List
ดูเหมือนว่าจะไม่มีคำตอบใดจัดรูปแบบในกรณีชื่อเรื่องจริง: "How to Land Your Dream Job", "To Kill a Mockingbird" ฯลฯ ดังนั้นฉันจึงสร้างวิธีการของตัวเอง ทำงานได้ดีที่สุดสำหรับข้อความภาษาอังกฤษ
private final static Set<Character> TITLE_CASE_DELIMITERS = new HashSet<>();
static {
TITLE_CASE_DELIMITERS.add(' ');
TITLE_CASE_DELIMITERS.add('.');
TITLE_CASE_DELIMITERS.add(',');
TITLE_CASE_DELIMITERS.add(';');
TITLE_CASE_DELIMITERS.add('/');
TITLE_CASE_DELIMITERS.add('-');
TITLE_CASE_DELIMITERS.add('(');
TITLE_CASE_DELIMITERS.add(')');
}
private final static Set<String> TITLE_SMALLCASED_WORDS = new HashSet<>();
static {
TITLE_SMALLCASED_WORDS.add("a");
TITLE_SMALLCASED_WORDS.add("an");
TITLE_SMALLCASED_WORDS.add("the");
TITLE_SMALLCASED_WORDS.add("for");
TITLE_SMALLCASED_WORDS.add("in");
TITLE_SMALLCASED_WORDS.add("on");
TITLE_SMALLCASED_WORDS.add("of");
TITLE_SMALLCASED_WORDS.add("and");
TITLE_SMALLCASED_WORDS.add("but");
TITLE_SMALLCASED_WORDS.add("or");
TITLE_SMALLCASED_WORDS.add("nor");
TITLE_SMALLCASED_WORDS.add("to");
}
public static String toCapitalizedWord(String oneWord) {
if (oneWord.length() < 1) {
return oneWord.toUpperCase();
}
return "" + Character.toTitleCase(oneWord.charAt(0)) + oneWord.substring(1).toLowerCase();
}
public static String toTitledWord(String oneWord) {
if (TITLE_SMALLCASED_WORDS.contains(oneWord.toLowerCase())) {
return oneWord.toLowerCase();
}
return toCapitalizedWord(oneWord);
}
public static String toTitleCase(String str) {
StringBuilder result = new StringBuilder();
StringBuilder oneWord = new StringBuilder();
char previousDelimiter = 'x';
/* on start, always move to upper case */
for (char c : str.toCharArray()) {
if (TITLE_CASE_DELIMITERS.contains(c)) {
if (previousDelimiter == '-' || previousDelimiter == 'x') {
result.append(toCapitalizedWord(oneWord.toString()));
} else {
result.append(toTitledWord(oneWord.toString()));
}
oneWord.setLength(0);
result.append(c);
previousDelimiter = c;
} else {
oneWord.append(c);
}
}
if (previousDelimiter == '-' || previousDelimiter == 'x') {
result.append(toCapitalizedWord(oneWord.toString()));
} else {
result.append(toTitledWord(oneWord.toString()));
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(toTitleCase("one year in paris"));
System.out.println(toTitleCase("How to Land Your Dream Job"));
}
นี่เป็นทางออกที่ง่ายที่สุด
static void title(String a,String b){
String ra = Character.toString(Character.toUpperCase(a.charAt(0)));
String rb = Character.toString(Character.toUpperCase(b.charAt(0)));
for(int i=1;i<a.length();i++){
ra+=a.charAt(i);
}
for(int i=1;i<b.length();i++){
rb+=b.charAt(i);
}
System.out.println(ra+" "+rb);
สิ่งนี้ควรใช้งานได้:
String str="i like pancakes";
String arr[]=str.split(" ");
String strNew="";
for(String str1:arr)
{
Character oldchar=str1.charAt(0);
Character newchar=Character.toUpperCase(str1.charAt(0));
strNew=strNew+str1.replace(oldchar,newchar)+" ";
}
System.out.println(strNew);
วิธีที่ง่ายที่สุดในการแปลงสตริงใด ๆ เป็นตัวพิมพ์ใหญ่คือการใช้แพ็คเกจ googles org.apache.commons.lang.WordUtils
System.out.println(WordUtils.capitalizeFully("tHis will BE MY EXAMple"));
จะได้ผลลัพธ์นี้
นี่จะเป็นตัวอย่างของฉัน
ฉันไม่แน่ใจว่าทำไมมันถึงชื่อว่า "capitalizeFully" ซึ่งในความเป็นจริงแล้วฟังก์ชันไม่ได้ให้ผลลัพธ์ที่เป็นตัวพิมพ์ใหญ่ แต่อย่างใดนั่นคือเครื่องมือที่เราต้องการ
capitalizeFully
เนื่องจากใช้ตัวพิมพ์ใหญ่ทุกคำรวมทั้งคำที่ควรเป็นตัวพิมพ์เล็กในชื่อ grammar.about.com/od/tz/g/Title-Case.htm
ขออภัยฉันเป็นมือใหม่ทำให้นิสัยการเขียนโค้ดของฉันแย่มาก!
public class TitleCase {
String title(String sent)
{
sent =sent.trim();
sent = sent.toLowerCase();
String[] str1=new String[sent.length()];
for(int k=0;k<=str1.length-1;k++){
str1[k]=sent.charAt(k)+"";
}
for(int i=0;i<=sent.length()-1;i++){
if(i==0){
String s= sent.charAt(i)+"";
str1[i]=s.toUpperCase();
}
if(str1[i].equals(" ")){
String s= sent.charAt(i+1)+"";
str1[i+1]=s.toUpperCase();
}
System.out.print(str1[i]);
}
return "";
}
public static void main(String[] args) {
TitleCase a = new TitleCase();
System.out.println(a.title(" enter your Statement!"));
}
}