DetailsView
とTextBox
があり、FIRST LETTER IN CAPITALで入力データ be 常に保存が欲しいのですが。
例:
"red" --> "Red"
"red house" --> " Red house"
どうやってこれを達成することができます パフォーマンスの最大化
_ note _ :
答えとその答えの下のコメントに基づいて、これは文字列中のall単語の大文字化について質問していると考える人が多くいます。例えば。 => Red House
そうではありませんが、それがあなたが求めているものであれば 、TextInfo
のToTitleCase
メソッドを使用する答えの1つを探してください。 (注:実際に尋ねられた質問に対して、これらの回答は誤りです。
TextInfo.ToTitleCase doc を参照してください(すべて大文字の単語には触れません。頭字語と見なされます。単語の途中に小文字の "小文字を使わないでください"、など) "=>"マクドナルド ";大文字と小文字の区別に関するすべての文化固有の微妙な問題を処理することは保証されていません。)
_ note _ :
最初の文字の後の文字を forced に小文字にするかどうかについての質問はあいまいです。受け入れられた答えは最初の文字だけが変えられるべきですと仮定します。 最初の文字を除くすべての文字 _を強制的に小文字にしたい場合は、ToLower
とToTitleCaseを含まないを含む答えを探してください。
EDIT: また、拡張メソッドとして、より新しい構文(およびより正しい答え)に更新されました。
public static class StringExtensions
{
public static string FirstCharToUpper(this string input)
{
switch (input)
{
case null: throw new ArgumentNullException(nameof(input));
case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
default: return input.First().ToString().ToUpper() + input.Substring(1);
}
}
}
古い答え
public static string FirstCharToUpper(string input)
{
if (String.IsNullOrEmpty(input))
throw new ArgumentException("ARGH!");
return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}
_ edit _ :このバージョンはもっと短いです。もっと早い解決策としては、 Equiso's answer をご覧ください。
public static string FirstCharToUpper(string input)
{
if (String.IsNullOrEmpty(input))
throw new ArgumentException("ARGH!");
return input.First().ToString().ToUpper() + input.Substring(1);
}
EDIT 2 :おそらく最速の解決策は Darren's (ベンチマークさえあります)ですが、元の要件では最初の文字が存在することを想定して例外をスローするようにstring.IsNullOrEmpty(s)
バリデーションを変更します大文字にする。このコードは一般的な文字列に対して機能し、特にTextbox
からの有効な値に対しては機能しません。
public string FirstLetterToUpper(string str)
{
if (str == null)
return null;
if (str.Length > 1)
return char.ToUpper(str[0]) + str.Substring(1);
return str.ToUpper();
}
昔の答え:これは大文字へのすべての最初の文字を作る
public string ToTitleCase(string str)
{
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}
正しい方法は、Cultureを使用することです。
Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Word.ToLower())
注: これにより、文字列内の各Wordが大文字になります。 "レッドハウス" - > "レッドハウス"解決策はまた、単語内の小文字の大文字小文字を区別します。 "古いマクドナルド" - > "古いマクドナルド".
私は http://www.dotnetperls.com/uppercase-first-letter から最速の方法を取り、拡張方法に変換しました:
/// <summary>
/// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
/// </summary>
public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
{
if (string.IsNullOrEmpty(s))
return string.Empty;
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
注:ToCharArray
を使用する理由は代替のchar.ToUpper(s[0]) + s.Substring(1)
より速いです、1つの文字列だけが割り当てられるのに対して、Substring
アプローチは部分文字列に文字列を割り当て、次に2番目の文字列が最終結果を構成するためです。
_ edit _ :これは CarlosMuñozが受け付ける答えからの最初のテストと組み合わせたものです :
/// <summary>
/// Returns the input string with the first character converted to uppercase
/// </summary>
public static string FirstLetterToUpperCase(this string s)
{
if (string.IsNullOrEmpty(s))
throw new ArgumentException("There is no first letter");
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
「ToTitleCaseメソッド」を使用することができます
string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House
この拡張方法はすべてのタイトルケース問題を解決します。
使いやすい
string str = "red house";
str.ToTitleCase();
//result : Red house
string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House
extensionメソッド
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace Test
{
public static class StringHelper
{
private static CultureInfo ci = new CultureInfo("en-US");
//Convert all first latter
public static string ToTitleCase(this string str)
{
str = str.ToLower();
var strArray = str.Split(' ');
if (strArray.Length > 1)
{
strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
return string.Join(" ", strArray);
}
return ci.TextInfo.ToTitleCase(str);
}
public static string ToTitleCase(this string str, TitleCase tcase)
{
str = str.ToLower();
switch (tcase)
{
case TitleCase.First:
var strArray = str.Split(' ');
if (strArray.Length > 1)
{
strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
return string.Join(" ", strArray);
}
break;
case TitleCase.All:
return ci.TextInfo.ToTitleCase(str);
default:
break;
}
return ci.TextInfo.ToTitleCase(str);
}
}
public enum TitleCase
{
First,
All
}
}
エラーチェック付きの最初の文字
public string CapitalizeFirstLetter(string s)
{
if (String.IsNullOrEmpty(s))
return s;
if (s.Length == 1)
return s.ToUpper();
return s.Remove(1).ToUpper() + s.Substring(1);
}
これは便利な拡張機能と同じです。
public static string CapitalizeFirstLetter(this string s)
{
if (String.IsNullOrEmpty(s)) return s;
if (s.Length == 1) return s.ToUpper();
return s.Remove(1).ToUpper() + s.Substring(1);
}
public static string ToInvarianTitleCase(this string self)
{
if (string.IsNullOrWhiteSpace(self))
{
return self;
}
return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}
パフォーマンスやメモリ使用量が問題になる場合は、これで、元の文字列と同じサイズのStringBuilderと新しいStringが1つだけ作成されます。
public static string ToUpperFirst(this string str) {
if( !string.IsNullOrEmpty( str ) ) {
StringBuilder sb = new StringBuilder(str);
sb[0] = char.ToUpper(sb[0]);
return sb.ToString();
} else return str;
}
これを試して:
static public string UpperCaseFirstCharacter(this string text) {
return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}
最初の文字を大文字にするだけで、残りの文字列が問題にならない場合は、最初の文字を選択するだけで、最初の文字を大文字にして、元の最初の文字を除いた残りの文字列と連結できます。
String Word ="red house";
Word = Word[0].ToString().ToUpper() + Word.Substring(1, Word.length -1);
//result: Word = "Red house"
最初の文字をToString()に変換する必要があります。これはChar配列として読み取っているため、Char型にはToUpper()メソッドがありません。
これは拡張メソッドとしてそれをする方法です:
static public string UpperCaseFirstCharacter(this string text)
{
if (!string.IsNullOrEmpty(text))
{
return string.Format(
"{0}{1}",
text.Substring(0, 1).ToUpper(),
text.Substring(1));
}
return text;
}
そのようにすることができます:
//yields "This is Brian's test.":
"this is Brian's test.".UpperCaseFirstCharacter();
そして、ここにいくつかのユニットテストがあります。
[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
string orig = "";
string result = orig.UpperCaseFirstCharacter();
Assert.AreEqual(orig, result);
}
[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
string orig = "c";
string result = orig.UpperCaseFirstCharacter();
Assert.AreEqual("C", result);
}
[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
string orig = "this is Brian's test.";
string result = orig.UpperCaseFirstCharacter();
Assert.AreEqual("This is Brian's test.", result);
}
最速の方法です。
private string Capitalize(string s){
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
テストは次の結果を表示します(入力として10000000記号の付いた文字列): テスト結果
私はここで何かを見つけました http://www.dotnetperls.com/uppercase-first-letter :
static string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}
多分これは役立ちます!
偶然にもこれに取り組んでいて、何かアイデアを探し回っていたので、これが私がやって来た解決策です。これはLINQを使用し、最初の文字が文字でなくても、文字列の最初の文字を大文字にすることができます。これが私が作った拡張方法です。
public static string CaptalizeFirstLetter(this string data)
{
var chars = data.ToCharArray();
// Find the Index of the first letter
var charac = data.First(char.IsLetter);
var i = data.IndexOf(charac);
// capitalize that letter
chars[i] = char.ToUpper(chars[i]);
return new string(chars);
}
これを少し最適化またはクリーンアップする方法があると確信しています。
これはそれをするでしょうが、それはまた御言葉の冒頭にない誤った首都がないことを確かにするでしょうが。
public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;
return t.ToTitleCase(s);
}
あなたが必要とするのがすべてであるとき、ここにたくさんの複雑さがあるようです:
/// <summary>
/// Returns the input string with the first character converted to uppercase if a letter
/// </summary>
/// <remarks>Null input returns null</remarks>
public static string FirstLetterToUpperCase(this string s)
{
if (string.IsNullOrWhiteSpace(s))
return s;
return char.ToUpper(s[0]) + s.Substring(1);
}
注目すべき点:
その拡張方法.
入力がnull、空、または空白の場合、入力はそのまま返されます。
String.IsNullOrWhiteSpace は.NET Framework 4で導入されました。これは古いフレームワークでは動作しません。
「最高のパフォーマンス」という回答を提供したいと思いました。私の考えでは、「最大パフォーマンス」の回答はすべてのシナリオを把握し、それらのシナリオを考慮した質問に対する回答を提供します。だから、ここに私の答えです。これらの理由で:
オプションのパラメータとしてそれらを提供することは、毎回選択されたカルチャをタイプする必要なしにこの方法を完全に再利用可能にします。
public static string capString(string instring, string culture = "en-US", bool useSystem = false)
{
string outstring;
if (String.IsNullOrWhiteSpace(instring))
{
return "";
}
instring = instring.Trim();
char thisletter = instring.First();
if (!char.IsLetter(thisletter))
{
return instring;
}
outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
if (instring.Length > 1)
{
outstring += instring.Substring(1);
}
return outstring;
}
私は以下の方法が最善の解決策だと思います
class Program
{
static string UppercaseWords(string value)
{
char[] array = value.ToCharArray();
// Handle the first letter in the string.
if (array.Length >= 1)
{
if (char.IsLower(array[0]))
{
array[0] = char.ToUpper(array[0]);
}
}
// Scan through the letters, checking for spaces.
// ... Uppercase the lowercase letters following spaces.
for (int i = 1; i < array.Length; i++)
{
if (array[i - 1] == ' ')
{
if (char.IsLower(array[i]))
{
array[i] = char.ToUpper(array[i]);
}
}
}
return new string(array);
}
static void Main()
{
// Uppercase words in these strings.
const string value1 = "something in the way";
const string value2 = "dot net PERLS";
const string value3 = "String_two;three";
const string value4 = " sam";
// ... Compute the uppercase strings.
Console.WriteLine(UppercaseWords(value1));
Console.WriteLine(UppercaseWords(value2));
Console.WriteLine(UppercaseWords(value3));
Console.WriteLine(UppercaseWords(value4));
}
}
Output
Something In The Way
Dot Net PERLS
String_two;three
Sam
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();
最初の文字を大文字にする最も簡単な方法は次のとおりです。
1- System.Globalizationを使用します。
// Creates a TextInfo based on the "en-US" culture.
TextInfo myTI = new CultureInfo("en-US",false).
myTI.ToTitleCase(textboxname.Text)
`
ここで与えられた解決策のどれも文字列の前に空白を扱わないように思えます。
これを考えとして追加するだけです。
public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
if (string.IsNullOrWhiteSpace(aValue))
return aValue;
string trimmed = aIgonreLeadingSpaces
? aValue.TrimStart()
: aValue;
return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}
それはthis won't work on other answers
(その文は最初にスペースがある)を処理するべきです、そして、あなたがスペーストリミングが好きでないならば、ちょうど2番目のパラメータとしてfalse
name__を渡してください(または処理したいならデフォルトをfalse
name__に変え、true
name__を渡してください)スペース)
FluentSharpはこれを行うlowerCaseFirstLetter
メソッドを持っています
これは最初の文字とスペースに続くすべての文字を大文字にし、それ以外の文字は小文字にします。
public string CapitalizeFirstLetterAfterSpace(string input)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
bool capitalizeNextLetter = true;
for(int pos = 0; pos < sb.Length; pos++)
{
if(capitalizeNextLetter)
{
sb[pos]=System.Char.ToUpper(sb[pos]);
capitalizeNextLetter = false;
}
else
{
sb[pos]=System.Char.ToLower(sb[pos]);
}
if(sb[pos]=' ')
{
capitalizeNextLetter=true;
}
}
}
次のコードを使用してください。
string strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();
次の関数はあらゆる点で正しいです。
static string UppercaseWords(string value)
{
char[] array = value.ToCharArray();
// Handle the first letter in the string.
if (array.Length >= 1)
{
if (char.IsLower(array[0]))
{
array[0] = char.ToUpper(array[0]);
}
}
// Scan through the letters, checking for spaces.
// ... Uppercase the lowercase letters following spaces.
for (int i = 1; i < array.Length; i++)
{
if (array[i - 1] == ' ')
{
if (char.IsLower(array[i]))
{
array[i] = char.ToUpper(array[i]);
}
}
}
return new string(array);
}
私はそれを見つけました ここ
最近私は同じような要求があり、LINQ関数Select()がインデックスを提供することを思い出しました:
string input;
string output;
input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"
私はそれを頻繁に必要としているので、文字列型の拡張メソッドを作りました。
public static class StringExtensions
{
public static string FirstLetterToUpper(this string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
}
}
最初の文字だけが大文字に変換され、残りの文字はすべて触れられないことに注意してください。他の文字を小文字にする必要がある場合は、index> 0の場合はChar.ToLower(currentChar)を呼び出すか、最初の文字列全体でToLower()を呼び出します。
パフォーマンスについては、コードとDarrenのソリューションを比較しました。私のマシンでは、Darrenのコードは約2倍高速です。これは彼がchar配列内の最初の文字だけを直接編集しているためです。最速の解決策が必要な場合は、Darrenのコードを利用することをお勧めします。他の文字列操作も統合したい場合は、入力文字列の文字に触れるラムダ関数の表現力を持たせるのが便利かもしれません - あなたはこの関数を簡単に拡張することができます - そこで私はここでこの解決を残します。
上記のCarlosの質問を拡張して、もしあなたが複数の文章を大文字にしたいのなら、このコードを使うことができます:
/// <summary>
/// Capitalize first letter of every sentence.
/// </summary>
/// <param name="inputSting"></param>
/// <returns></returns>
public string CapitalizeSentences (string inputSting)
{
string result = string.Empty;
if (!string.IsNullOrEmpty(inputSting))
{
string[] sentences = inputSting.Split('.');
foreach (string sentence in sentences)
{
result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1));
}
}
return result;
}
最速の方法です:
public static unsafe void ToUpperFirst(this string str)
{
if (str == null) return;
fixed (char* ptr = str)
*ptr = char.ToUpper(*ptr);
}
元の文字列を変更せずに
public static unsafe string ToUpperFirst(this string str)
{
if (str == null) return null;
string ret = string.Copy(str);
fixed (char* ptr = ret)
*ptr = char.ToUpper(*ptr);
return ret;
}