มนุษย์Humanizer ตรงตามความต้องการ. NET ทั้งหมดของคุณสำหรับการจัดการและการแสดงสตริง, enums, วันที่, เวลา, เวลา, ตัวเลขและปริมาณ
คุณสามารถติดตั้ง Humanizer เป็นแพ็คเกจ Nuget:
ภาษาอังกฤษเท่านั้น : Humanizer.Core
ทุกภาษา: Humanizer
รองรับเฟรมเวิร์กต่อไปนี้: Net4.8, Net6, Net7 และ Net8
หมายเหตุ: NUGET ยังกำหนดเป้าหมาย NetStandard2 นี่คือการเปิดใช้งานสถานการณ์ที่จำเป็นต้องใช้ NetStandard2 ตัวอย่างเช่น Roslyn Analyzers หรือ MSBuild เฟรมเวิร์กอื่น ๆ (นอกเหนือจากที่ระบุไว้ข้างต้น) ที่สามารถใช้ NetStandard2 (ตัวอย่าง Net4.6.1 ถึง Net 4.7.2) ไม่ได้รับการสนับสนุน ตัวอย่างเช่น Net4.6.1 ถึง Net4.7.2 ไม่ได้รับการสนับสนุน
นอกจากนี้สัญลักษณ์ของ Humanizer นั้นได้รับการจัดทำดัชนีด้วย SourceLink และรวมอยู่ในแพ็คเกจเพื่อให้คุณสามารถก้าวผ่านรหัส Humanizer ในขณะที่ดีบักรหัสของคุณ
คุณเลือกแพ็คเกจใดตามแพ็คเกจ NUGET ที่คุณติดตั้ง โดยค่าเริ่มต้นแพ็คเกจ Main Humanizer 2.0 จะติดตั้งภาษาที่รองรับทั้งหมดเหมือนใน 1.x หากคุณไม่แน่ใจให้ใช้แพ็คเกจ Humanizer หลัก
นี่คือตัวเลือก:
Humanizer หลัก สิ่งนี้ดึงใน Humanizer.Core และแพ็คเกจภาษาทั้งหมดHumanizer.Core จะมีทรัพยากรภาษาอังกฤษเท่านั้นHumanizer.Core.fr คุณสามารถรวมหลายภาษาโดยการติดตั้งแพ็คเกจภาษามากมายที่คุณต้องการคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานนี้อยู่ในความคิดเห็นที่นี่
ส่วนขยายของสตริง Humanize ช่วยให้คุณเปลี่ยนสตริงคอมพิวเตอร์เป็นอย่างอื่นให้กลายเป็นหนึ่งที่เป็นมิตรกับมนุษย์ที่อ่านได้มากขึ้น รากฐานของสิ่งนี้ถูกตั้งค่าในกรอบ BDDFY ที่ชื่อคลาสชื่อวิธีและคุณสมบัติจะกลายเป็นประโยคที่อ่านได้ของมนุษย์
"PascalCaseInputStringIsTurnedIntoSentence" . Humanize ( ) => "Pascal case input string is turned into sentence"
"Underscored_input_string_is_turned_into_sentence" . Humanize ( ) => "Underscored input string is turned into sentence"
"Underscored_input_String_is_turned_INTO_sentence" . Humanize ( ) => "Underscored input String is turned INTO sentence" โปรดทราบว่าสตริงที่มีตัวอักษรตัวพิมพ์ใหญ่เท่านั้นและประกอบด้วยคำเดียวเท่านั้นที่ได้รับการปฏิบัติเสมอเป็นตัวย่อ (โดยไม่คำนึงถึงความยาว) เพื่อรับประกันว่าสตริงโดยพลการใด ๆ จะเป็นมนุษย์เสมอคุณต้องใช้การแปลง (ดูวิธี Transform ด้านล่าง):
// acronyms are left intact
"HTML" . Humanize ( ) => "HTML "
// any unbroken upper case string is treated as an acronym
" HUMANIZER" . Humanize ( ) => "HUMANIZER"
"HUMANIZER" . Transform ( To . LowerCase , To . TitleCase ) => "Humanizer"คุณอาจระบุตัวอักษรที่ต้องการ:
"CanReturnTitleCase" . Humanize ( LetterCasing . Title ) => "Can Return Title Case "
" Can_return_title_Case" . Humanize ( LetterCasing . Title ) => "Can Return Title Case"
"CanReturnLowerCase" . Humanize ( LetterCasing . LowerCase ) => "can return lower case"
"CanHumanizeIntoUpperCase" . Humanize ( LetterCasing . AllCaps ) => "CAN HUMANIZE INTO UPPER CASE"API
LetterCasingและวิธีการยอมรับว่าเป็นมรดกจาก V0.2 ERA และจะเลิกใช้ในอนาคต แทนที่จะเป็นเช่นนั้นคุณสามารถใช้วิธีTransformที่อธิบายไว้ด้านล่าง
เหมือนกับที่คุณสามารถทำให้เป็นมนุษย์ที่เป็นมิตรกับคอมพิวเตอร์ในสตริงที่เป็นมิตรของมนุษย์คุณสามารถลดทอนความเป็นมนุษย์สายสตริงที่เป็นมิตรกับมนุษย์ลงในคอมพิวเตอร์ที่เป็นมิตรกับคอมพิวเตอร์:
"Pascal case input string is turned into sentence" . Dehumanize ( ) => "PascalCaseInputStringIsTurnedIntoSentence" มีวิธี Transform ที่แทนที่ LetterCasing , ApplyCase และ Humanize overloads ที่ยอมรับ LetterCasing Transform Method Signature มีดังนี้:
string Transform ( this string input , params IStringTransformer [ ] transformers ) และมีการใช้งานนอกกรอบของ IStringTransformer สำหรับตัวอักษร:
"Sentence casing" . Transform ( To . LowerCase ) => "sentence casing "
" Sentence casing ".Transform(To.SentenceCase) => " Sentence casing "
"Sentence casing" . Transform ( To . TitleCase ) => "Sentence Casing"
"Sentence casing" . Transform ( To . UpperCase ) => "SENTENCE CASING" LowerCase เป็นคุณสมบัติคงที่สาธารณะใน To ที่ส่งคืนอินสแตนซ์ของคลาส ToLowerCase ส่วนตัวที่ใช้ IStringTransformer และรู้วิธีเปลี่ยนสตริงให้กลายเป็นตัวพิมพ์เล็ก
ประโยชน์ของการใช้ Transform และ IStringTransformer ผ่าน ApplyCase และ LetterCasing คือการ LetterCasing เป็น enum และคุณ จำกัด ที่จะใช้สิ่งที่อยู่ในกรอบในขณะที่ IStringTransformer เป็นอินเทอร์เฟซที่คุณสามารถนำไปใช้ใน codebase ของคุณหนึ่งครั้งและใช้ด้วยวิธี Transform
คุณสามารถตัด string โดยใช้วิธี Truncate :
"Long text to truncate" . Truncate ( 10 ) => "Long text…" โดยค่าเริ่มต้นอักขระ '…' จะใช้เพื่อตัดทอนสตริง ข้อได้เปรียบของการใช้ตัวละคร '…' แทน "..." คืออดีตใช้เวลาเพียงตัวละครตัวเดียวและอนุญาตให้แสดงข้อความมากขึ้นก่อนการตัดทอน หากคุณต้องการคุณสามารถจัดเตรียมสตริงการตัดทอนของคุณเอง:
"Long text to truncate" . Truncate ( 10 , "---" ) => "Long te -- - " กลยุทธ์การตัดทอนเริ่มต้น, Truncator.FixedLength คือการตัดทอนสตริงอินพุตเป็นความยาวเฉพาะรวมถึงความยาวสตริงการตัดทอน มีกลยุทธ์การตัดทอนอีกสองกลยุทธ์: หนึ่งรายการสำหรับจำนวนอักขระ (อัลฟ่า-ตัวเลข) จำนวนคงที่และอีกตัวหนึ่งสำหรับจำนวนคำที่คงที่ ในการใช้ truncator เฉพาะเมื่อถูกตัดทอนวิธี Truncate ทั้งสองที่แสดงในตัวอย่างก่อนหน้านี้มีการโอเวอร์โหลดที่อนุญาตให้คุณระบุอินสแตนซ์ ITruncator เพื่อใช้สำหรับการตัดทอน นี่คือตัวอย่างเกี่ยวกับวิธีการใช้ผู้ตัดทอนทั้งสาม:
"Long text to truncate" . Truncate ( 10 , Truncator . FixedLength ) => "Long text…"
"Long text to truncate" . Truncate ( 10 , "---" , Truncator . FixedLength ) => "Long te---"
"Long text to truncate" . Truncate ( 6 , Truncator . FixedNumberOfCharacters ) => "Long t…"
"Long text to truncate" . Truncate ( 6 , "---" , Truncator . FixedNumberOfCharacters ) => "Lon---"
"Long text to truncate" . Truncate ( 2 , Truncator . FixedNumberOfWords ) => "Long text…"
"Long text to truncate" . Truncate ( 2 , "---" , Truncator . FixedNumberOfWords ) => "Long text---" โปรดทราบว่าคุณสามารถใช้สร้าง truncator ของคุณเองโดยใช้อินเทอร์เฟซ ITruncator
นอกจากนี้ยังมีตัวเลือกในการเลือกว่าจะตัดทอนสตริงจากจุดเริ่มต้น ( TruncateFrom.Left ) หรือปลาย ( TruncateFrom.Right ) ค่าเริ่มต้นคือสิทธิดังแสดงในตัวอย่างด้านบน ตัวอย่างด้านล่างแสดงวิธีการตัดทอนจากจุดเริ่มต้นของสตริง:
"Long text to truncate" . Truncate ( 10 , Truncator . FixedLength , TruncateFrom . Left ) => "… truncate"
"Long text to truncate" . Truncate ( 10 , "---" , Truncator . FixedLength , TruncateFrom . Left ) => "---runcate"
"Long text to truncate" . Truncate ( 10 , Truncator . FixedNumberOfCharacters , TruncateFrom . Left ) => "…o truncate"
"Long text to truncate" . Truncate ( 16 , "---" , Truncator . FixedNumberOfCharacters , TruncateFrom . Left ) => "---ext to truncate"
"Long text to truncate" . Truncate ( 2 , Truncator . FixedNumberOfWords , TruncateFrom . Left ) => "…to truncate"
"Long text to truncate" . Truncate ( 2 , "---" , Truncator . FixedNumberOfWords , TruncateFrom . Left ) => "---to truncate" การโทร ToString โดยตรงกับสมาชิก ENUM มักจะส่งผลน้อยกว่าผลลัพธ์ที่เหมาะสมสำหรับผู้ใช้ การแก้ปัญหานี้มักจะใช้คำอธิบายข้อมูลคำ DescriptionAttribute ข้อมูลและจากนั้นอ่านว่าที่รันไทม์เพื่อให้ได้ผลลัพธ์ที่เป็นมิตรมากขึ้น นั่นเป็นทางออกที่ยอดเยี่ยม แต่บ่อยครั้งที่เราไม่เพียง แต่ต้องใส่ช่องว่างระหว่างคำของสมาชิก enum - ซึ่งเป็นสิ่งที่ String.Humanize() ทำได้ดี สำหรับ enum ชอบ:
public enum EnumUnderTest
{
[ Description ( "Custom description" ) ]
MemberWithDescriptionAttribute ,
MemberWithoutDescriptionAttribute ,
ALLCAPITALS
}คุณจะได้รับ:
// DescriptionAttribute is honored
EnumUnderTest . MemberWithDescriptionAttribute . Humanize ( ) => "Custom description"
// In the absence of Description attribute string.Humanizer kicks in
EnumUnderTest . MemberWithoutDescriptionAttribute . Humanize ( ) => "Member without description attribute"
// Of course you can still apply letter casing
EnumUnderTest . MemberWithoutDescriptionAttribute . Humanize ( ) . Transform ( To . TitleCase ) => "Member Without Description Attribute" คุณไม่ได้ จำกัด เฉพาะ DescriptionAttribute สำหรับคำอธิบายที่กำหนดเอง แอตทริบิวต์ใด ๆ ที่ใช้กับสมาชิก enum ที่มีจำนวนคุณสมบัติ string Description นี่คือความช่วยเหลือเกี่ยวกับแพลตฟอร์มที่ไม่มี DescriptionAttribute ที่ขาดหายไปและยังอนุญาตให้ subclasses ของ DescriptionAttribute
คุณยังสามารถกำหนดค่าชื่อของคุณสมบัติของ attbiody เพื่อใช้เป็นคำอธิบาย
Configurator.EnumDescriptionPropertyLocator = p => p.Name == "Info"
หากคุณต้องการให้คำอธิบายที่แปลเป็นภาษาท้องถิ่นคุณสามารถใช้คำอธิบายประกอบข้อมูล DisplayAttribute แทน
public enum EnumUnderTest
{
[ Display ( Description = "EnumUnderTest_Member" , ResourceType = typeof ( Project . Resources ) ) ]
Member
}คุณจะได้รับ:
EnumUnderTest . Member . Humanize ( ) => "content" // from Project.Resources found under "EnumUnderTest_Member" resource keyหวังว่าสิ่งนี้จะช่วยหลีกเลี่ยงการทิ้งขยะด้วยคุณลักษณะที่ไม่จำเป็น!
ลดทอนความเป็นมนุษย์ใน enum มันเดิมเป็นมนุษย์! API ดูเหมือน:
public static TTargetEnum DehumanizeTo < TTargetEnum > ( this string input )และการใช้งานคือ:
"Member without description attribute" . DehumanizeTo < EnumUnderTest > ( ) => EnumUnderTest . MemberWithoutDescriptionAttribute และเช่นเดียวกับ API Humanize มันให้เกียรติคุณลักษณะ Description คุณไม่จำเป็นต้องจัดเตรียมปลอกที่คุณให้ไว้ในระหว่างการมีมนุษยธรรม: มันเป็นตัวเลข
นอกจากนี้ยังมีคู่ที่ไม่ใช่ Generic สำหรับเมื่อไม่ทราบ enum ดั้งเดิมในเวลาคอมไพล์:
public static Enum DehumanizeTo ( this string input , Type targetEnum , NoMatch onNoMatch = NoMatch . ThrowsException )ซึ่งสามารถใช้เช่น:
"Member without description attribute" . DehumanizeTo ( typeof ( EnumUnderTest ) ) => EnumUnderTest . MemberWithoutDescriptionAttribute โดยค่าเริ่มต้นทั้งสองวิธีจะโยน NoMatchFoundException เมื่อพวกเขาไม่สามารถจับคู่อินพุตที่ให้ไว้กับ enum เป้าหมายได้ ในวิธีการที่ไม่ใช่ Generic คุณยังสามารถขอให้วิธีการส่งคืนค่า null โดยการตั้งค่าพารามิเตอร์ตัวเลือกที่สองเป็น NoMatch.ReturnsNull
คุณสามารถ Humanize ซ์ของ DateTime หรือ DateTimeOffset และรับสตริงกลับมาบอกได้ว่าย้อนกลับไปหรือส่งต่อในเวลานั้นได้ไกลแค่ไหน:
DateTime . UtcNow . AddHours ( - 30 ) . Humanize ( ) => "yesterday"
DateTime . UtcNow . AddHours ( - 2 ) . Humanize ( ) => "2 hours ago"
DateTime . UtcNow . AddHours ( 30 ) . Humanize ( ) => "tomorrow"
DateTime . UtcNow . AddHours ( 2 ) . Humanize ( ) => "2 hours from now"
DateTimeOffset . UtcNow . AddHours ( 1 ) . Humanize ( ) => "an hour from now" Humanizer รองรับทั้งวันที่ในท้องถิ่นและ UTC รวมถึงวันที่ที่มีออฟเซ็ต ( DateTimeOffset ) คุณยังสามารถให้วันที่ที่คุณต้องการให้เปรียบเทียบวันที่อินพุตกับ ถ้าเป็นโมฆะมันจะใช้วันที่ปัจจุบันเป็นฐานเปรียบเทียบ นอกจากนี้วัฒนธรรมที่จะใช้สามารถระบุได้อย่างชัดเจน หากไม่ได้ใช้วัฒนธรรม UI ปัจจุบันของเธรดในปัจจุบัน นี่คือลายเซ็น API:
public static string Humanize ( this DateTime input , bool utcDate = true , DateTime ? dateToCompareAgainst = null , CultureInfo culture = null )
public static string Humanize ( this DateTimeOffset input , DateTimeOffset ? dateToCompareAgainst = null , CultureInfo culture = null )มีการแปลจำนวนมากสำหรับวิธีนี้ นี่คือตัวอย่างบางส่วน:
// In ar culture
DateTime . UtcNow . AddDays ( - 1 ) . Humanize ( ) => "أمس"
DateTime . UtcNow . AddDays ( - 2 ) . Humanize ( ) => "منذ يومين"
DateTime . UtcNow . AddDays ( - 3 ) . Humanize ( ) => "منذ 3 أيام"
DateTime . UtcNow . AddDays ( - 11 ) . Humanize ( ) => "منذ 11 يوم"
// In ru-RU culture
DateTime . UtcNow . AddMinutes ( - 1 ) . Humanize ( ) => "минуту назад"
DateTime . UtcNow . AddMinutes ( - 2 ) . Humanize ( ) => "2 минуты назад"
DateTime . UtcNow . AddMinutes ( - 10 ) . Humanize ( ) => "10 минут назад"
DateTime . UtcNow . AddMinutes ( - 21 ) . Humanize ( ) => "21 минуту назад"
DateTime . UtcNow . AddMinutes ( - 22 ) . Humanize ( ) => "22 минуты назад"
DateTime . UtcNow . AddMinutes ( - 40 ) . Humanize ( ) => "40 минут назад" มีสองกลยุทธ์สำหรับ DateTime.Humanize : ค่าเริ่มต้นตามที่เห็นด้านบนและความแม่นยำตาม ในการใช้กลยุทธ์ตามความแม่นยำคุณต้องกำหนดค่า:
Configurator . DateTimeHumanizeStrategy = new PrecisionDateTimeHumanizeStrategy ( precision : .75 ) ;
Configurator . DateTimeOffsetHumanizeStrategy = new PrecisionDateTimeOffsetHumanizeStrategy ( precision : .75 ) ; // configure when humanizing DateTimeOffsetความแม่นยำเริ่มต้นถูกตั้งค่าเป็น. 75 แต่คุณสามารถผ่านความแม่นยำที่คุณต้องการได้เช่นกัน ด้วยความแม่นยำตั้งค่าเป็น 0.75:
44 seconds => 44 seconds ago / from now
45 seconds => one minute ago / from now
104 seconds => one minute ago / from now
105 seconds => two minutes ago / from now
25 days => a month ago / from now ไม่มีการลดทอนความเป็นมนุษย์สำหรับวันที่ Humanize เป็นการเปลี่ยนแปลงที่สูญเสียและวันที่เป็นมิตรของมนุษย์ไม่สามารถย้อนกลับได้
คุณสามารถเรียก Humanize ใน TimeSpan เพื่อรับการเป็นตัวแทนที่เป็นมิตรกับมนุษย์:
TimeSpan . FromMilliseconds ( 1 ) . Humanize ( ) => "1 millisecond"
TimeSpan . FromMilliseconds ( 2 ) . Humanize ( ) => "2 milliseconds"
TimeSpan . FromDays ( 1 ) . Humanize ( ) => "1 day"
TimeSpan . FromDays ( 16 ) . Humanize ( ) => "2 weeks" มีพารามิเตอร์ precision เสริมสำหรับ TimeSpan.Humanize ซึ่งช่วยให้คุณสามารถระบุความแม่นยำของค่าที่ส่งคืน ค่าเริ่มต้นของ precision คือ 1 ซึ่งหมายถึงเฉพาะหน่วยเวลาที่ใหญ่ที่สุดเท่านั้นที่ถูกส่งคืนเหมือนที่คุณเห็นใน TimeSpan.FromDays(16).Humanize() นี่คือตัวอย่างบางส่วนของการระบุความแม่นยำ:
TimeSpan . FromDays ( 1 ) . Humanize ( precision : 2 ) => "1 day" // no difference when there is only one unit in the provided TimeSpan
TimeSpan . FromDays ( 16 ) . Humanize ( 2 ) => "2 weeks, 2 days"
// the same TimeSpan value with different precision returns different results
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( ) => "2 weeks"
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 ) => "2 weeks, 1 day, 1 hour"
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 4 ) => "2 weeks, 1 day, 1 hour, 30 seconds"
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 5 ) => "2 weeks, 1 day, 1 hour, 30 seconds, 20 milliseconds" โดยค่าเริ่มต้นเมื่อใช้พารามิเตอร์ precision พารามิเตอร์เวลาว่างจะไม่ถูกนับเป็นความแม่นยำของค่าที่ส่งคืน หากพฤติกรรมนี้ไม่ต้องการให้คุณคุณสามารถใช้วิธีการ overloaded TimeSpan.Humanize Method กับพารามิเตอร์ countEmptyUnits หน่วยเวลาว่างที่ว่างไม่เคยนับ นี่คือตัวอย่างที่แสดงความแตกต่างของการนับหน่วยเปล่า:
TimeSpan . FromMilliseconds ( 3603001 ) . Humanize ( 3 ) => "1 hour, 3 seconds, 1 millisecond"
TimeSpan . FromMilliseconds ( 3603001 ) . Humanize ( 3 , countEmptyUnits : true ) => "1 hour, 3 seconds"มีการแปลจำนวนมากสำหรับวิธีนี้:
// in de-DE culture
TimeSpan . FromDays ( 1 ) . Humanize ( ) => "Ein Tag"
TimeSpan . FromDays ( 2 ) . Humanize ( ) => "2 Tage"
// in sk-SK culture
TimeSpan . FromMilliseconds ( 1 ) . Humanize ( ) => "1 milisekunda"
TimeSpan . FromMilliseconds ( 2 ) . Humanize ( ) => "2 milisekundy"
TimeSpan . FromMilliseconds ( 5 ) . Humanize ( ) => "5 milisekúnd"วัฒนธรรมที่จะใช้สามารถระบุได้อย่างชัดเจน หากไม่ได้ใช้วัฒนธรรม UI ปัจจุบันของเธรดในปัจจุบัน ตัวอย่าง:
TimeSpan . FromDays ( 1 ) . Humanize ( culture : "ru-RU" ) => "один день"นอกจากนี้อาจมีการระบุหน่วยเวลาขั้นต่ำเพื่อหลีกเลี่ยงการกลิ้งลงในหน่วยที่เล็กกว่า ตัวอย่างเช่น:
TimeSpan . FromMilliseconds ( 122500 ) . Humanize ( minUnit : TimeUnit . Second ) => "2 minutes, 2 seconds" // instead of 2 minutes, 2 seconds, 500 milliseconds
TimeSpan . FromHours ( 25 ) . Humanize ( minUnit : TimeUnit . Day ) => "1 Day" //instead of 1 Day, 1 Hourนอกจากนี้อาจมีการระบุหน่วยสูงสุดเพื่อหลีกเลี่ยงการกลิ้งไปยังหน่วยที่ใหญ่ที่สุดถัดไป ตัวอย่างเช่น:
TimeSpan . FromDays ( 7 ) . Humanize ( maxUnit : TimeUnit . Day ) => "7 days" // instead of 1 week
TimeSpan . FromMilliseconds ( 2000 ) . Humanize ( maxUnit : TimeUnit . Millisecond ) => "2000 milliseconds" // instead of 2 seconds maxunit เริ่มต้นคือ TimeUnit.Week เพราะให้ผลลัพธ์ที่แน่นอน คุณสามารถเพิ่มมูลค่านี้ไปยัง TimeUnit.Month หรือ TimeUnit.Year ซึ่งจะให้การประมาณตาม 365.2425 วันต่อปีและ 30.436875 วันต่อเดือน ดังนั้นเดือนสลับกันระหว่าง 30 ถึง 31 วันและทุกปีที่สี่มีความยาว 366 วัน
TimeSpan . FromDays ( 486 ) . Humanize ( maxUnit : TimeUnit . Year , precision : 7 ) => "1 year, 3 months, 29 days" // One day further is 1 year, 4 month
TimeSpan . FromDays ( 517 ) . Humanize ( maxUnit : TimeUnit . Year , precision : 7 ) => "1 year, 4 months, 30 days" // This month has 30 days and one day further is 1 year, 5 months เมื่อมีหลายหน่วยเวลาพวกเขาจะรวมกันโดยใช้สตริง ", " :
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 ) => "2 weeks, 1 day, 1 hour" เมื่อ TimeSpan เป็นศูนย์พฤติกรรมเริ่มต้นจะกลับ "0" บวกกับหน่วยเวลาขั้นต่ำ อย่างไรก็ตามหากคุณมอบหมาย true to toWords เมื่อเรียก Humanize แล้ววิธีการจะกลับ "ไม่มีเวลา" ตัวอย่างเช่น:
TimeSpan . Zero . Humanize ( 1 ) => "0 milliseconds"
TimeSpan . Zero . Humanize ( 1 , toWords : true ) => "no time"
TimeSpan . Zero . Humanize ( 1 , minUnit : Humanizer . Localisation . TimeUnit . Second ) => "0 seconds" การใช้พารามิเตอร์ collectionSeparator คุณสามารถระบุสตริงตัวคั่นของคุณเอง:
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 , collectionSeparator : " - " ) => "2 weeks - 1 day - 1 hour" นอกจากนี้ยังเป็นไปได้ที่จะใช้รูปแบบคอลเลกชันของวัฒนธรรมปัจจุบันเพื่อรวมหน่วยเวลา หากต้องการทำเช่นนั้นให้ระบุ null เป็นพารามิเตอร์ collectionSeparator :
// in en-US culture
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 , collectionSeparator : null ) => "2 weeks, 1 day, and 1 hour"
// in de-DE culture
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 , collectionSeparator : null ) => "2 Wochen, Ein Tag und Eine Stunde" หากคำศัพท์เป็นที่ต้องการของตัวเลข toWords: true สามารถตั้งค่าให้แปลงตัวเลขในช่วงเวลาที่เป็นมนุษย์เป็นคำ:
TimeSpan . FromMilliseconds ( 1299630020 ) . Humanize ( 3 , toWords : true ) => "two weeks, one day, one hour" โดยการโทรหา ToAge TimeSpan สามารถแสดงเป็นอายุได้ สำหรับวัฒนธรรมที่ไม่ได้กำหนดการแสดงออกของอายุผลลัพธ์จะเหมือนกับการเรียก Humanize (แต่มี maxUnit เริ่มต้นเท่ากับ TimeUnit.Year )
// in en-US culture
TimeSpan . FromDays ( 750 ) . ToAge ( ) => "2 years old"
// in fr culture
TimeSpan . FromDays ( 750 ) . ToAge ( ) => "2 ans" คุณสามารถโทรหา Humanize บน IEnumerable ใด ๆ เพื่อรับสตริงที่จัดรูปแบบได้อย่างสวยงามซึ่งแสดงถึงวัตถุในคอลเลกชัน โดยค่าเริ่มต้น ToString() จะถูกเรียกใช้ในแต่ละรายการเพื่อรับการเป็นตัวแทน แต่ฟังก์ชั่นการจัดรูปแบบอาจถูกส่งผ่านไปยัง Humanize แทน นอกจากนี้ยังมีตัวคั่นเริ่มต้น ("และ" เป็นภาษาอังกฤษ) แต่ตัวคั่นที่แตกต่างกันอาจถูกส่งผ่านไปยัง Humanize
ตัวอย่างเช่น:
class SomeClass
{
public string SomeString ;
public int SomeInt ;
public override string ToString ( )
{
return "Specific String" ;
}
}
string FormatSomeClass ( SomeClass sc )
{
return string . Format ( "SomeObject #{0} - {1}" , sc . SomeInt , sc . SomeString ) ;
}
var collection = new List < SomeClass >
{
new SomeClass { SomeInt = 1 , SomeString = "One" } ,
new SomeClass { SomeInt = 2 , SomeString = "Two" } ,
new SomeClass { SomeInt = 3 , SomeString = "Three" }
} ;
collection . Humanize ( ) // "Specific String, Specific String, and Specific String"
collection . Humanize ( "or" ) // "Specific String, Specific String, or Specific String"
collection . Humanize ( FormatSomeClass ) // "SomeObject #1 - One, SomeObject #2 - Two, and SomeObject #3 - Three"
collection . Humanize ( sc => sc . SomeInt . Ordinalize ( ) , "or" ) // "1st, 2nd, or 3rd"รายการถูกตัดแต่งและว่างเปล่า (nullorwhitespace) รายการถูกข้าม ส่งผลให้เครื่องหมายเครื่องหมายจุลภาคที่สะอาด (หากมีฟังก์ชั่น Formatter ที่กำหนดเองสิ่งนี้จะใช้กับผลลัพธ์ของ Formatter เท่านั้น)
คุณสามารถจัดเตรียมรูปแบบคอลเลกชันของคุณเองได้โดยการใช้ ICollectionFormatter และลงทะเบียนด้วย Configurator.CollectionFormatters
นอกจากนี้ยังมีวิธีการติดเชื้อไม่กี่วิธี:
Pluralize พหูพจน์อินพุตที่ให้ไว้ในขณะที่พิจารณาคำที่ผิดปกติและไม่สามารถนับได้:
"Man" . Pluralize ( ) => "Men "
" string" . Pluralize ( ) => "strings" โดยปกติคุณจะเรียก Pluralize ด้วยคำแปลก ๆ แต่ถ้าคุณไม่แน่ใจเกี่ยวกับความเป็นเอกเทศของคำที่คุณสามารถเรียกวิธีการนี้ด้วยอาร์กิวเมนต์ inputIsKnownToBeSingular เป็นตัวเลือก
"Men" . Pluralize ( inputIsKnownToBeSingular : false ) => "Men "
" Man" . Pluralize ( inputIsKnownToBeSingular : false ) => "Men"
"string" . Pluralize ( inputIsKnownToBeSingular : false ) => "strings" การ Pluralize ส่วนใหญ่มีอาร์กิวเมนต์ plurality ล้าสมัยและถูกลบออกในเวอร์ชัน 2.0
Singularize เป็นเอกเทศที่เป็นเอกเทศอินพุตที่ให้ไว้ในขณะที่พิจารณาคำที่ผิดปกติและไม่สามารถนับได้:
"Men" . Singularize ( ) => "Man "
" strings" . Singularize ( ) => "string" โดยปกติคุณจะเรียกว่า Singularize ในคำพหูพจน์ แต่ถ้าคุณไม่แน่ใจเกี่ยวกับส่วนใหญ่ของคำที่คุณสามารถเรียกวิธีการนี้ด้วย inputIsKnownToBePlural ที่เป็นตัวเลือก
"Men" . Singularize ( inputIsKnownToBePlural : false ) => "Man "
" Man" . Singularize ( inputIsKnownToBePlural : false ) => "Man"
"strings" . Singularize ( inputIsKnownToBePlural : false ) => "string" การโอเวอร์โหลดของ Singularize มีอาร์กิวเมนต์ plurality ล้าสมัยและถูกลบออกในเวอร์ชัน 2.0
บางครั้งคุณอาจจำเป็นต้องเพิ่มกฎจากคำศัพท์เฉพาะ/พหุภาคี (ตัวอย่างด้านล่างอยู่ใน DefaultVocabulary ที่ใช้โดย Inflector ):
// Adds a word to the vocabulary which cannot easily be pluralized/singularized by RegEx.
// Will match both "salesperson" and "person".
Vocabularies . Default . AddIrregular ( "person" , "people" ) ;
// To only match "person" and not "salesperson" you would pass false for the 'matchEnding' parameter.
Vocabularies . Default . AddIrregular ( "person" , "people" , matchEnding : false ) ;
// Adds an uncountable word to the vocabulary. Will be ignored when plurality is changed:
Vocabularies . Default . AddUncountable ( "fish" ) ;
// Adds a rule to the vocabulary that does not follow trivial rules for pluralization:
Vocabularies . Default . AddPlural ( "bus" , "buses" ) ;
// Adds a rule to the vocabulary that does not follow trivial rules for singularization
// (will match both "vertices" -> "vertex" and "indices" -> "index"):
Vocabularies . Default . AddSingular ( "(vert|ind)ices$" , "$1ex" ) ; หลายครั้งที่คุณต้องการเรียกว่า Singularize และ Pluralize เพื่อนำหน้าคำด้วยตัวเลข เช่น "2 คำขอ", "3 คน" ToQuantity หน้าคำนำหน้าคำที่ให้ไว้ด้วยจำนวนและพหูพจน์ตามคำหรือทำให้คำว่าเป็นเอกเทศ:
"case" . ToQuantity ( 0 ) => "0 cases"
"case" . ToQuantity ( 1 ) => "1 case"
"case" . ToQuantity ( 5 ) => "5 cases"
"man" . ToQuantity ( 0 ) => "0 men"
"man" . ToQuantity ( 1 ) => "1 man"
"man" . ToQuantity ( 2 ) => "2 men" ToQuantity สามารถเข้าใจได้ว่าคำที่ป้อนนั้นเป็นเอกพจน์หรือพหูพจน์และจะทำให้เป็นเอกเทศหรือเป็นพหูพจน์ตามความจำเป็น:
"men" . ToQuantity ( 2 ) => "2 men"
"process" . ToQuantity ( 2 ) => "2 processes"
"process" . ToQuantity ( 1 ) => "1 process"
"processes" . ToQuantity ( 2 ) => "2 processes"
"processes" . ToQuantity ( 1 ) => "1 process" นอกจากนี้คุณยังสามารถผ่านอาร์กิวเมนต์ที่สอง ShowQuantityAs ไปยัง ToQuantity เพื่อระบุวิธีที่คุณต้องการให้ปริมาณที่ให้มาถูกส่งออก ค่าเริ่มต้นคือ ShowQuantityAs.Numeric ซึ่งเป็นสิ่งที่เราเห็นข้างต้น อีกสองค่าคือ ShowQuantityAs.Words และ ShowQuantityAs.None
"case" . ToQuantity ( 5 , ShowQuantityAs . Words ) => "five cases "
" case" . ToQuantity ( 5 , ShowQuantityAs . None ) => "cases"นอกจากนี้ยังมีการโอเวอร์โหลดที่อนุญาตให้คุณจัดรูปแบบหมายเลข คุณสามารถผ่านในรูปแบบและวัฒนธรรมที่จะใช้
"dollar" . ToQuantity ( 2 , "C0" , new CultureInfo ( "en-US" ) ) => "$2 dollars"
"dollar" . ToQuantity ( 2 , "C2" , new CultureInfo ( "en-US" ) ) => "$2.00 dollars"
"cases" . ToQuantity ( 12000 , "N0" ) => "12,000 cases" Ordinalize เปลี่ยนตัวเลขเป็นสตริงลำดับที่ใช้เพื่อแสดงตำแหน่งในลำดับที่สั่งเช่น 1, 2, 3, 4:
1 . Ordinalize ( ) => "1st"
5 . Ordinalize ( ) => "5th" นอกจากนี้คุณยังสามารถโทร Ordinalize ในสตริงตัวเลขและได้ผลลัพธ์เดียวกัน: "21".Ordinalize() => "21st"
Ordinalize ยังรองรับเพศไวยากรณ์สำหรับทั้งสองรูปแบบ คุณสามารถส่งอาร์กิวเมนต์เพื่อ Ordinalize เพื่อระบุว่าเพศ GrammaticalGender.Neuter มีการส่งออกเพศใดค่าที่เป็น GrammaticalGender.Feminine ได้คือ GrammaticalGender.Masculine
// for Brazilian Portuguese locale
1 . Ordinalize ( GrammaticalGender . Masculine ) => "1º"
1 . Ordinalize ( GrammaticalGender . Feminine ) => "1ª"
1 . Ordinalize ( GrammaticalGender . Neuter ) => "1º"
"2" . Ordinalize ( GrammaticalGender . Masculine ) => "2º"
"2" . Ordinalize ( GrammaticalGender . Feminine ) => "2ª"
"2" . Ordinalize ( GrammaticalGender . Neuter ) => "2º"เห็นได้ชัดว่าสิ่งนี้ใช้กับบางวัฒนธรรมเท่านั้น สำหรับคนอื่น ๆ ที่ผ่านเพศในหรือไม่ผ่านเลยไม่ได้สร้างความแตกต่างในผลลัพธ์
นอกจากนี้ Ordinalize การสนับสนุนการเปลี่ยนแปลงบางวัฒนธรรมมีผลบังคับใช้ขึ้นอยู่กับตำแหน่งของจำนวนลำดับในประโยค ใช้อาร์กิวเมนต์ wordForm เพื่อรับหนึ่งผลลัพธ์หรืออื่น ๆ ค่าที่เป็นไปได้คือ WordForm.Abbreviation และ WordForm.Normal คุณสามารถรวมอาร์กิวเมนต์ wordForm กับเพศ แต่ผ่านอาร์กิวเมนต์นี้เมื่อไม่สามารถใช้งานได้จะไม่สร้างความแตกต่างในผลลัพธ์
// Spanish locale
1 . Ordinalize ( WordForm . Abbreviation ) => "1.er" // As in "Vivo en el 1.er piso"
1 . Ordinalize ( WordForm . Normal ) => "1.º" // As in "He llegado el 1º"
"3" . Ordinalize ( GrammaticalGender . Feminine , WordForm . Abbreviation ) => "3.ª"
"3" . Ordinalize ( GrammaticalGender . Feminine , WordForm . Normal ) => "3.ª"
"3" . Ordinalize ( GrammaticalGender . Masculine , WordForm . Abbreviation ) => "3.er"
"3" . Ordinalize ( GrammaticalGender . Masculine , WordForm . Normal ) => "3.º" Titleize แปลงคำอินพุตเป็นปลอกชื่อ; เทียบเท่ากับ "some title".Humanize(LetterCasing.Title)
Pascalize แปลงคำอินพุตเป็นตัวพิมพ์ใหญ่และยังลบขีดล่างและช่องว่าง:
"some_title for something" . Pascalize ( ) => "SomeTitleForSomething" Camelize ทำงานเหมือนกันกับ Pascalize ยกเว้นว่าตัวละครตัวแรกนั้นเป็นตัวพิมพ์เล็ก:
"some_title for something" . Camelize ( ) => "someTitleForSomething" Underscore แยกคำอินพุตด้วยขีดล่าง:
"SomeTitle" . Underscore ( ) => "some_title" Dasherize และ Hyphenate แทนที่ขีดล่างด้วยขีดกลางในสตริง:
"some_title" . Dasherize ( ) => "some-title"
"some_title" . Hyphenate ( ) => "some-title" Kebaberize แยกคำอินพุตด้วยยัติภังค์และคำทั้งหมดจะถูกแปลงเป็นตัวพิมพ์เล็ก
"SomeText" . Kebaberize ( ) => "some-text" Humanizer ให้ API ที่คล่องแคล่วในการจัดการกับ DateTime และ TimeSpan ดังนี้:
วิธีการ TimeSpan :
2 . Milliseconds ( ) => TimeSpan . FromMilliseconds ( 2 )
2 . Seconds ( ) => TimeSpan . FromSeconds ( 2 )
2 . Minutes ( ) => TimeSpan . FromMinutes ( 2 )
2 . Hours ( ) => TimeSpan . FromHours ( 2 )
2 . Days ( ) => TimeSpan . FromDays ( 2 )
2 . Weeks ( ) => TimeSpan . FromDays ( 14 )ไม่มี API ที่คล่องแคล่วสำหรับเดือนหรือปีเนื่องจากเดือนอาจมีระหว่าง 28 ถึง 31 วันและปีอาจเป็น 365 หรือ 366 วัน
คุณสามารถใช้วิธีการเหล่านี้เพื่อแทนที่
DateTime . Now . AddDays ( 2 ) . AddHours ( 3 ) . AddMinutes ( - 5 )กับ
DateTime . Now + 2 . Days ( ) + 3 . Hours ( ) - 5 . Minutes ( ) นอกจากนี้ยังมีวิธีการที่คล่องแคล่วสามประเภทในการจัดการกับ DateTime :
In . TheYear ( 2010 ) // Returns the first of January of 2010
In . January // Returns 1st of January of the current year
In . FebruaryOf ( 2009 ) // Returns 1st of February of 2009
In . One . Second // DateTime.UtcNow.AddSeconds(1);
In . Two . SecondsFrom ( DateTime dateTime )
In . Three . Minutes // With corresponding From method
In . Three . Hours // With corresponding From method
In . Three . Days // With corresponding From method
In . Three . Weeks // With corresponding From method
In . Three . Months // With corresponding From method
In . Three . Years // With corresponding From method
On . January . The4th // Returns 4th of January of the current year
On . February . The ( 12 ) // Returns 12th of Feb of the current yearและวิธีการขยายบางอย่าง:
var someDateTime = new DateTime ( 2011 , 2 , 10 , 5 , 25 , 45 , 125 ) ;
// Returns new DateTime(2008, 2, 10, 5, 25, 45, 125) changing the year to 2008
someDateTime . In ( 2008 )
// Returns new DateTime(2011, 2, 10, 2, 25, 45, 125) changing the hour to 2:25:45.125
someDateTime . At ( 2 )
// Returns new DateTime(2011, 2, 10, 2, 20, 15, 125) changing the time to 2:20:15.125
someDateTime . At ( 2 , 20 , 15 )
// Returns new DateTime(2011, 2, 10, 12, 0, 0) changing the time to 12:00:00.000
someDateTime . AtNoon ( )
// Returns new DateTime(2011, 2, 10, 0, 0, 0) changing the time to 00:00:00.000
someDateTime . AtMidnight ( ) เห็นได้ชัดว่าคุณสามารถใช้วิธีการด้วยเช่นกัน เช่น On.November.The13th.In(2010).AtNoon + 5.Minutes()
Humanizer ให้ API ที่คล่องแคล่วซึ่งสร้างตัวเลข (โดยปกติจะใหญ่) ในรูปแบบที่ชัดเจนยิ่งขึ้น:
1.25 . Billions ( ) => 1250000000
3 . Hundreds ( ) . Thousands ( ) => 300000 Humanizer สามารถเปลี่ยนตัวเลขเป็นคำโดยใช้ส่วนขยาย ToWords :
1 . ToWords ( ) => "one"
10 . ToWords ( ) => "ten"
11 . ToWords ( ) => "eleven"
122 . ToWords ( ) => "one hundred and twenty-two"
3501 . ToWords ( ) => "three thousand five hundred and one" นอกจากนี้คุณยังสามารถผ่านอาร์กิวเมนต์ที่สอง GrammaticalGender ไปยัง ToWords เพื่อระบุเพศที่ควรจะส่งออกค่าใดค่าที่เป็นไปได้คือ GrammaticalGender.Masculine , GrammaticalGender.Feminine และ GrammaticalGender.Neuter
// for Russian locale
1 . ToWords ( GrammaticalGender . Masculine ) => "один"
1 . ToWords ( GrammaticalGender . Feminine ) => "одна"
1 . ToWords ( GrammaticalGender . Neuter ) => "одно" // for Arabic locale
1 . ToWords ( GrammaticalGender . Masculine ) => "واحد"
1 . ToWords ( GrammaticalGender . Feminine ) => "واحدة"
1 . ToWords ( GrammaticalGender . Neuter ) => "واحد"
( - 1 ) . ToWords ( ) => "ناقص واحد"เห็นได้ชัดว่าสิ่งนี้ใช้กับบางวัฒนธรรมเท่านั้น สำหรับคนอื่น ๆ ที่ผ่านเพศไม่ได้สร้างความแตกต่างในผลลัพธ์
นอกจากนี้วัฒนธรรมที่จะใช้สามารถระบุได้อย่างชัดเจน หากไม่ได้ใช้วัฒนธรรม UI ปัจจุบันของเธรดในปัจจุบัน นี่คือตัวอย่าง:
11 . ToWords ( new CultureInfo ( "en" ) ) => "eleven"
1 . ToWords ( GrammaticalGender . Masculine , new CultureInfo ( "ru" ) ) => "один"อีกวิธีหนึ่งของวิธีการอนุญาตให้คุณผ่านบูลเพื่อลบ "และ" ที่สามารถเพิ่มได้ก่อนหมายเลขสุดท้าย:
3501 . ToWords ( false ) => "three thousand five hundred one"
102 . ToWords ( false ) => "one hundred two"วิธีนี้มีประโยชน์สำหรับการเขียนการตรวจสอบเช่น
นอกจากนี้ ToWords ยังสนับสนุนรูปแบบบางอย่างที่ใช้ในการใช้งานขึ้นอยู่กับตำแหน่งของจำนวนในประโยค ใช้อาร์กิวเมนต์ wordForm เพื่อรับหนึ่งผลลัพธ์หรืออื่น ๆ ค่าที่เป็นไปได้คือ WordForm.Abbreviation และ WordForm.Normal อาร์กิวเมนต์นี้สามารถรวมกับส่วนที่เหลือของอาร์กิวเมนต์ที่นำเสนอข้างต้น การผ่านอาร์กิวเมนต์ wordForm เมื่อไม่สามารถใช้งานได้จะไม่สร้างความแตกต่างในผลลัพธ์
// Spanish locale
21501 . ToWords ( WordForm . Abbreviation , GrammaticalGender . Masculine ) => "veintiún mil quinientos un"
21501 . ToWords ( WordForm . Normal , GrammaticalGender . Masculine ) => "veintiún mil quinientos uno"
21501 . ToWords ( WordForm . Abbreviation , GrammaticalGender . Feminine ) => "veintiuna mil quinientas una"
// English US locale
21501 . ToWords ( WordForm . Abbreviation , GrammaticalGender . Masculine , new CultureInfo ( "en-US" ) ) => "twenty-one thousand five hundred and one" นี่คือการผสม ToWords กับ Ordinalize คุณสามารถโทรหา ToOrdinalWords บนตัวเลขเพื่อรับการแสดงลำดับของหมายเลขเป็นคำ! ตัวอย่างเช่น:
0 . ToOrdinalWords ( ) => "zeroth"
1 . ToOrdinalWords ( ) => "first"
2 . ToOrdinalWords ( ) => "second"
8 . ToOrdinalWords ( ) => "eighth"
10 . ToOrdinalWords ( ) => "tenth"
11 . ToOrdinalWords ( ) => "eleventh"
12 . ToOrdinalWords ( ) => "twelfth"
20 . ToOrdinalWords ( ) => "twentieth"
21 . ToOrdinalWords ( ) => "twenty first"
121 . ToOrdinalWords ( ) => "hundred and twenty first" ToOrdinalWords ยังรองรับเพศไวยากรณ์ คุณสามารถผ่านอาร์กิวเมนต์ที่สองไปยัง ToOrdinalWords เพื่อระบุเพศของผลลัพธ์ ค่าที่เป็นไปได้คือ GrammaticalGender.Masculine , GrammaticalGender.Feminine และ GrammaticalGender.Neuter :
// for Brazilian Portuguese locale
1 . ToOrdinalWords ( GrammaticalGender . Masculine ) => "primeiro"
1 . ToOrdinalWords ( GrammaticalGender . Feminine ) => "primeira"
1 . ToOrdinalWords ( GrammaticalGender . Neuter ) => "primeiro"
2 . ToOrdinalWords ( GrammaticalGender . Masculine ) => "segundo"
2 . ToOrdinalWords ( GrammaticalGender . Feminine ) => "segunda"
2 . ToOrdinalWords ( GrammaticalGender . Neuter ) => "segundo" // for Arabic locale
1 . ToOrdinalWords ( GrammaticalGender . Masculine ) => "الأول"
1 . ToOrdinalWords ( GrammaticalGender . Feminine ) => "الأولى"
1 . ToOrdinalWords ( GrammaticalGender . Neuter ) => "الأول"
2 . ToOrdinalWords ( GrammaticalGender . Masculine ) => "الثاني"
2 . ToOrdinalWords ( GrammaticalGender . Feminine ) => "الثانية"
2 . ToOrdinalWords ( GrammaticalGender . Neuter ) => "الثاني"เห็นได้ชัดว่าสิ่งนี้ใช้กับบางวัฒนธรรมเท่านั้น สำหรับคนอื่น ๆ ที่ผ่านเพศไม่ได้สร้างความแตกต่างในผลลัพธ์
นอกจากนี้วัฒนธรรมที่จะใช้สามารถระบุได้อย่างชัดเจน หากไม่ได้ใช้วัฒนธรรม UI ปัจจุบันของเธรดในปัจจุบัน นี่คือตัวอย่าง:
10 . ToOrdinalWords ( new CultureInfo ( "en-US" ) ) => "tenth"
1 . ToOrdinalWords ( GrammaticalGender . Masculine , new CulureInfo ( "pt-BR" ) ) => "primeiro" ToOrdinalWords ยังรองรับการเปลี่ยนแปลงบางวัฒนธรรมใช้ขึ้นอยู่กับตำแหน่งของหมายเลขลำดับในประโยค ใช้อาร์กิวเมนต์ wordForm เพื่อรับหนึ่งผลลัพธ์หรืออื่น ๆ ค่าที่เป็นไปได้คือ WordForm.Abbreviation และ WordForm.Normal รวมอาร์กิวเมนต์นี้กับส่วนที่เหลือของข้อโต้แย้งที่นำเสนอข้างต้น การผ่านอาร์กิวเมนต์ wordForm เมื่อไม่สามารถใช้งานได้จะไม่สร้างความแตกต่างในผลลัพธ์
// Spanish locale
43 . ToOrdinalWords ( WordForm . Normal , GrammaticalGender . Masculine ) => "cuadragésimo tercero"
43 . ToOrdinalWords ( WordForm . Abbreviation , GrammaticalGender . Masculine ) => "cuadragésimo tercer"
43 . ToOrdinalWords ( WordForm . Abbreviation , GrammaticalGender . Feminine ) => "cuadragésima tercera"
// English locale
43 . ToOrdinalWords ( GrammaticalGender . Masculine , WordForm . Abbreviation , new CultureInfo ( "en" ) ) => "forty-third"นี่เป็นส่วนขยายของการกำหนดลำดับ
// for English UK locale
new DateTime ( 2015 , 1 , 1 ) . ToOrdinalWords ( ) => "1st January 2015"
new DateTime ( 2015 , 2 , 12 ) . ToOrdinalWords ( ) => "12th February 2015"
new DateTime ( 2015 , 3 , 22 ) . ToOrdinalWords ( ) => "22nd March 2015"
// for English US locale
new DateTime ( 2015 , 1 , 1 ) . ToOrdinalWords ( ) => "January 1st, 2015"
new DateTime ( 2015 , 2 , 12 ) . ToOrdinalWords ( ) => "February 12th, 2015"
new DateTime ( 2015 , 3 , 22 ) . ToOrdinalWords ( ) => "March 22nd, 2015" ToOrdinalWords ยังรองรับกรณีไวยากรณ์ คุณสามารถผ่านอาร์กิวเมนต์ที่สองไปยัง ToOrdinalWords เพื่อระบุกรณีของผลลัพธ์ ค่าที่เป็น GrammaticalCase.Accusative ได้คือ GrammaticalCase.Nominative , GrammaticalCase.Genitive , GrammaticalCase.Dative , GrammaticalCase.Instrumental และ GrammaticalGender.Prepositional :
เห็นได้ชัดว่าสิ่งนี้ใช้กับบางวัฒนธรรมเท่านั้น สำหรับคนอื่น ๆ ที่ผ่านเคสในไม่ได้สร้างความแตกต่างในผลลัพธ์
ขยายเวลาอย่างทันเวลาเพื่อให้มนุษย์เป็นสัญลักษณ์ของนาฬิกา
// for English US locale
new TimeOnly ( 3 , 0 ) . ToClockNotation ( ) => "three o'clock"
new TimeOnly ( 12 , 0 ) . ToClockNotation ( ) => "noon"
new TimeOnly ( 14 , 30 ) . ToClockNotation ( ) => "half past two"
// for Brazilian Portuguese locale
new TimeOnly ( 3 , 0 ) . ToClockNotation ( ) => "três em ponto"
new TimeOnly ( 12 , 0 ) . ToClockNotation ( ) => "meio-dia"
new TimeOnly ( 14 , 30 ) . ToClockNotation ( ) => "duas e meia" Humanizer สามารถเปลี่ยนตัวเลขเป็นตัวเลขโรมันโดยใช้ส่วนขยาย ToRoman หมายเลข 1 ถึง 10 สามารถแสดงเป็นตัวเลขโรมันดังนี้:
1 . ToRoman ( ) => "I"
2 . ToRoman ( ) => "II"
3 . ToRoman ( ) => "III"
4 . ToRoman ( ) => "IV"
5 . ToRoman ( ) => "V"
6 . ToRoman ( ) => "VI"
7 . ToRoman ( ) => "VII"
8 . ToRoman ( ) => "VIII"
9 . ToRoman ( ) => "IX"
10 . ToRoman ( ) => "X" นอกจากนี้การดำเนินการย้อนกลับโดยใช้ส่วนขยาย FromRoman
"I" . FromRoman ( ) => 1
"II" . FromRoman ( ) => 2
"III" . FromRoman ( ) => 3
"IV" . FromRoman ( ) => 4
"V" . FromRoman ( ) => 5โปรดทราบว่ามีเพียงจำนวนเต็มที่เล็กกว่า 4000 เท่านั้นที่สามารถแปลงเป็นตัวเลขโรมันได้
Humanizer สามารถเปลี่ยนตัวเลขเป็นตัวเลขเมตริกโดยใช้ส่วนขยาย ToMetric หมายเลข 1, 1230 และ 0.1 สามารถแสดงเป็นตัวเลขเมตริกได้ดังนี้:
1d . ToMetric ( ) => "1"
1230d . ToMetric ( ) => "1.23k"
0.1d . ToMetric ( ) => "100m" นอกจากนี้การดำเนินการย้อนกลับโดยใช้ส่วนขยาย FromMetric
"1" . FromMetric ( ) => 1
"1.23k" . FromMetric ( ) => 1230
"100m" . FromMetric ( ) => 0.1 Humanizer รวมถึงพอร์ตของห้องสมุด Bytesize ที่ยอดเยี่ยม มีการเปลี่ยนแปลงและเพิ่มเติมเล็กน้อยที่ทำขึ้นบน ByteSize เพื่อให้การโต้ตอบกับ ByteSize ง่ายขึ้นและสอดคล้องกับ Humanizer API นี่คือตัวอย่างบางส่วนของวิธีการแปลงจากตัวเลขเป็นขนาดไบต์และระหว่างขนาดขนาด:
var fileSize = ( 10 ) . Kilobytes ( ) ;
fileSize . Bits => 81920
fileSize . Bytes => 10240
fileSize . Kilobytes => 10
fileSize . Megabytes => 0.009765625
fileSize . Gigabytes => 9.53674316e-6
fileSize . Terabytes => 9.31322575e-9มีวิธีการขยายสองสามวิธีที่อนุญาตให้คุณเปลี่ยนตัวเลขเป็นอินสแตนซ์ไบต์:
3 . Bits ( ) ;
5 . Bytes ( ) ;
( 10.5 ) . Kilobytes ( ) ;
( 2.5 ) . Megabytes ( ) ;
( 10.2 ) . Gigabytes ( ) ;
( 4.7 ) . Terabytes ( ) ;นอกจากนี้คุณยังสามารถเพิ่ม/ลบค่าโดยใช้ +/- ตัวดำเนินการและเพิ่ม/ลบวิธีการ:
var total = ( 10 ) . Gigabytes ( ) + ( 512 ) . Megabytes ( ) - ( 2.5 ) . Gigabytes ( ) ;
total . Subtract ( ( 2500 ) . Kilobytes ( ) ) . Add ( ( 25 ) . Megabytes ( ) ) ; วัตถุ ByteSize มีคุณสมบัติสองคุณสมบัติที่แสดงสัญลักษณ์และค่าคำนำหน้าตัวชี้วัดที่ใหญ่ที่สุด:
var maxFileSize = ( 10 ) . Kilobytes ( ) ;
maxFileSize . LargestWholeNumberSymbol ; // "KB"
maxFileSize . LargestWholeNumberValue ; // 10 หากคุณต้องการการเป็นตัวแทนสตริงคุณสามารถเรียก ToString หรือ Humanize แทนกันได้ใน ByteSize ซ์ไบต์:
7 . Bits ( ) . ToString ( ) ; // 7 b
8 . Bits ( ) . ToString ( ) ; // 1 B
( .5 ) . Kilobytes ( ) . Humanize ( ) ; // 512 B
( 1000 ) . Kilobytes ( ) . ToString ( ) ; // 1000 KB
( 1024 ) . Kilobytes ( ) . Humanize ( ) ; // 1 MB
( .5 ) . Gigabytes ( ) . Humanize ( ) ; // 512 MB
( 1024 ) . Gigabytes ( ) . ToString ( ) ; // 1 TB นอกจากนี้คุณยังสามารถเลือกรูปแบบสำหรับการแสดงสตริงที่คาดหวัง Formatter สามารถมีสัญลักษณ์ของค่าที่จะแสดง: b , B , KB , MB , GB , TB Formatter ใช้วิธีการ double.ToString ในตัวด้วย #.## เป็นรูปแบบเริ่มต้นซึ่งรอบตัวเลขเป็นทศนิยมสองตำแหน่ง:
var b = ( 10.505 ) . Kilobytes ( ) ;
// Default number format is #.##
b . ToString ( "KB" ) ; // 10.52 KB
b . Humanize ( "MB" ) ; // .01 MB
b . Humanize ( "b" ) ; // 86057 b
// Default symbol is the largest metric prefix value >= 1
b . ToString ( "#.#" ) ; // 10.5 KB
// All valid values of double.ToString(string format) are acceptable
b . ToString ( "0.0000" ) ; // 10.5050 KB
b . Humanize ( "000.00" ) ; // 010.51 KB
// You can include number format and symbols
b . ToString ( "#.#### MB" ) ; // .0103 MB
b . Humanize ( "0.00 GB" ) ; // 0 GB
b . Humanize ( "#.## B" ) ; // 10757.12 B หากคุณต้องการการแสดงสตริงที่มีคำเต็มคุณสามารถเรียก ToFullWords บนอินสแตนซ์ ByteSize :
7 . Bits ( ) . ToFullWords ( ) ; // 7 bits
8 . Bits ( ) . ToFullWords ( ) ; // 1 byte
( .5 ) . Kilobytes ( ) . ToFullWords ( ) ; // 512 bytes
( 1000 ) . Kilobytes ( ) . ToFullWords ( ) ; // 1000 kilobytes
( 1024 ) . Kilobytes ( ) . ToFullWords ( ) ; // 1 megabyte
( .5 ) . Gigabytes ( ) . ToFullWords ( ) ; // 512 megabytes
( 1024 ) . Gigabytes ( ) . ToFullWords ( ) ; // 1 terabyte ไม่มีวิธี Dehumanize เพื่อเปลี่ยนการแสดงสตริงกลับเป็น ByteSize ซ์ไบต์ แต่คุณสามารถใช้ Parse และ TryParse บน ByteSize เพื่อทำเช่นนั้น เช่นเดียวกับวิธี TryParse อื่น ๆ ByteSize.TryParse ส่งคืนค่า boolean ที่แสดงว่าการแยกวิเคราะห์ประสบความสำเร็จหรือไม่ หากค่าถูกแยกวิเคราะห์จะเป็นเอาต์พุตไปยังพารามิเตอร์ out ที่ให้มา:
ByteSize output ;
ByteSize . TryParse ( "1.5mb" , out output ) ;
// Invalid
ByteSize . Parse ( "1.5 b" ) ; // Can't have partial bits
// Valid
ByteSize . Parse ( "5b" ) ;
ByteSize . Parse ( "1.55B" ) ;
ByteSize . Parse ( "1.55KB" ) ;
ByteSize . Parse ( "1.55 kB " ) ; // Spaces are trimmed
ByteSize . Parse ( "1.55 kb" ) ;
ByteSize . Parse ( "1.55 MB" ) ;
ByteSize . Parse ( "1.55 mB" ) ;
ByteSize . Parse ( "1.55 mb" ) ;
ByteSize . Parse ( "1.55 GB" ) ;
ByteSize . Parse ( "1.55 gB" ) ;
ByteSize . Parse ( "1.55 gb" ) ;
ByteSize . Parse ( "1.55 TB" ) ;
ByteSize . Parse ( "1.55 tB" ) ;
ByteSize . Parse ( "1.55 tb" ) ; ในที่สุดหากคุณต้องการคำนวณอัตราที่มีการถ่ายโอนจำนวนไบต์คุณสามารถใช้วิธีการ Per ByteSize วิธี Per วิธียอมรับหนึ่งอาร์กิวเมนต์ - ช่วงเวลาการวัดสำหรับไบต์ นี่คือระยะเวลาที่ใช้ในการถ่ายโอนไบต์
วิธี Per ส่งคืนคลาส ByteRate ซึ่งมีวิธีการ Humanize โดยค่าเริ่มต้นอัตราจะได้รับในวินาที (เช่น MB/s) อย่างไรก็ตามหากต้องการเวลาอาจส่งผ่านไปยัง Humanize เป็นช่วงเวลาอื่น ช่วงเวลาที่ถูกต้องคือ TimeUnit.Second , TimeUnit.Minute และ TimeUnit.Hour ตัวอย่างของแต่ละช่วงเวลาและตัวอย่างการใช้อัตราไบต์อยู่ด้านล่าง
var size = ByteSize . FromMegabytes ( 10 ) ;
var measurementInterval = TimeSpan . FromSeconds ( 1 ) ;
var text = size . Per ( measurementInterval ) . Humanize ( ) ;
// 10 MB/s
text = size . Per ( measurementInterval ) . Humanize ( TimeUnit . Minute ) ;
// 600 MB/min
text = size . Per ( measurementInterval ) . Humanize ( TimeUnit . Hour ) ;
// 35.15625 GB/hourคุณสามารถระบุรูปแบบสำหรับส่วนไบต์ของผลลัพธ์ที่เป็นมนุษย์:
19854651984 . Bytes ( ) . Per ( 1 . Seconds ( ) ) . Humanize ( "#.##" ) ;
// 18.49 GB/s Humanizer รวมถึงวิธีการเปลี่ยนหัวตัวเลขเป็นคำ ส่วนหัวสามารถเป็น double ในขณะที่ผลลัพธ์จะเป็นสตริง คุณสามารถเลือกได้ว่าจะส่งคืนการเป็นตัวแทนอย่างเต็มรูปแบบ (เช่นทิศเหนือ, ตะวันออก, ใต้หรือตะวันตก), การเป็นตัวแทนสั้น ๆ (เช่น n, e, s, w) หรืออักขระลูกศร Unicode (เช่น↑, →, ↓, ←)
360 . ToHeading ( ) ;
// N
720 . ToHeading ( ) ;
// Nเพื่อที่จะดึงส่วนหัวเวอร์ชันเต็มให้ใช้สายต่อไปนี้:
180 . ToHeading ( HeadingStyle . Full ) ;
// south
360 . ToHeading ( HeadingStyle . Full ) ;
// northโปรดทราบว่าการแสดงข้อความมีค่าเบี่ยงเบนสูงสุด 11.25 °
วิธีการข้างต้นทั้งหมดมีการโอเวอร์โหลดซึ่งคุณสามารถจัดหาวัตถุ CultureInfo เพื่อกำหนดผลลัพธ์ที่ได้รับการแปลเพื่อส่งคืน
เพื่อดึงลูกศรที่เป็นตัวแทนของส่วนหัวใช้วิธีการต่อไปนี้:
90 . ToHeadingArrow ( ) ;
// →
225 . ToHeadingArrow ( ) ;
// ↙การแสดงลูกศรของส่วนหัวมีค่าเบี่ยงเบนสูงสุด 22.5 °
เพื่อที่จะดึงส่วนหัวตามการแสดงข้อความสั้น ๆ (เช่น N, E, S, W) สามารถใช้วิธีการต่อไปนี้ได้:
"S" . FromShortHeading ( ) ;
// 180
"SW" . FromShortHeading ( ) ;
// 225 Humanizer สามารถเปลี่ยนจำนวนทั้งหมดเป็น 'tuple' ของพวกเขาโดยใช้ Tupleize ตัวอย่างเช่น:
1 . Tupleize ( ) ;
// single
3 . Tupleize ( ) ;
// triple
100 . Tupleize ( ) ;
// centupleตัวเลข 1-10, 100 และ 1,000 จะถูกแปลงเป็น 'tuple' tuple (เช่น "ซิงเกิ้ล", "สองเท่า" ฯลฯ ) หมายเลขอื่น ๆ "n" จะถูกแปลงเป็น "n-tuple"
Humanizer สามารถแปลหน่วยเวลาเป็นสัญลักษณ์ของพวกเขา:
TimeUnit . Day . ToSymbol ( ) ;
// d
TimeUnit . Week . ToSymbol ( ) ;
// week
TimeUnit . Year . ToSymbol ( ) ;
// y นี่เป็นเพียงพื้นฐานและคุณสามารถใช้สิ่งนี้เพื่อทำให้งานประจำวันของคุณง่ายขึ้น ตัวอย่างเช่นใน ASP.NET MVC เราเก็บแอตทริบิวต์การแสดงผล Display บนคุณสมบัติ ViewModel เพื่อให้ HtmlHelper สามารถสร้างฉลากที่ถูกต้องสำหรับเรา แต่เช่นเดียวกับ enums ในกรณีส่วนใหญ่เราต้องการช่องว่างระหว่างคำในชื่อคุณสมบัติ - ดังนั้นทำไมไม่ใช้ "string".Humanize เพื่อสิ่งนั้น!
คุณอาจพบตัวอย่าง ASP.NET MVC ในรหัสที่ทำเช่นนั้น (แม้ว่าโครงการจะถูกแยกออกจากไฟล์โซลูชันเพื่อให้แพ็คเกจ NUGET พร้อมใช้งานสำหรับ. NET 3.5 ด้วย)
นี่คือความสำเร็จโดยใช้ DataAnnotationsModelMetadataProvider ที่กำหนดเองฉันเรียกว่า humanizermetadataprovider มันเล็กพอที่จะทำซ้ำที่นี่; แล้วไปเลย:
using System ;
using System . Collections . Generic ;
using System . ComponentModel ;
using System . ComponentModel . DataAnnotations ;
using System . Linq ;
using System . Web . Mvc ;
using Humanizer ;
public class HumanizerMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata (
IEnumerable < Attribute > attributes ,
Type containerType ,
Func < object > modelAccessor ,
Type modelType ,
string propertyName )
{
var propertyAttributes = attributes . ToList ( ) ;
var modelMetadata = base . CreateMetadata ( propertyAttributes , containerType , modelAccessor , modelType , propertyName ) ;
if ( IsTransformRequired ( modelMetadata , propertyAttributes ) )
modelMetadata . DisplayName = modelMetadata . PropertyName . Humanize ( ) ;
return modelMetadata ;
}
private static bool IsTransformRequired ( ModelMetadata modelMetadata , IList < Attribute > propertyAttributes )
{
if ( string . IsNullOrEmpty ( modelMetadata . PropertyName ) )
return false ;
if ( propertyAttributes . OfType < DisplayNameAttribute > ( ) . Any ( ) )
return false ;
if ( propertyAttributes . OfType < DisplayAttribute > ( ) . Any ( ) )
return false ;
return true ;
}
} คลาสนี้เรียกคลาสฐานเพื่อแยกเมตาดาต้าแล้วหากจำเป็นให้เป็นมนุษย์ชื่อทรัพย์สิน กำลังตรวจสอบว่าคุณสมบัติมีแอตทริบิวต์ DisplayName หรือ Display อยู่แล้วซึ่งในกรณีนี้ผู้ให้บริการข้อมูลเมตาจะให้เกียรติคุณลักษณะและออกจากทรัพย์สินเพียงอย่างเดียว สำหรับคุณสมบัติอื่น ๆ มันจะทำให้ชื่อทรัพย์สินเป็นมนุษย์ นั่นคือทั้งหมด
ตอนนี้คุณต้องลงทะเบียนผู้ให้บริการข้อมูลเมตานี้ด้วย ASP.NET MVC ตรวจสอบให้แน่ใจว่าคุณใช้ System.Web.Mvc.ModelMetadataProviders และไม่ใช่ System.Web.ModelBinding.ModelMetadataProviders :
ModelMetadataProviders . Current = new HumanizerMetadataProvider ( ) ;... และตอนนี้คุณสามารถแทนที่:
public class RegisterModel
{
[ Display ( Name = "User name" ) ]
public string UserName { get ; set ; }
[ Display ( Name = "Email address" ) ]
public string EmailAddress { get ; set ; }
[ Display ( Name = "Confirm password" ) ]
public string ConfirmPassword { get ; set ; }
}กับ:
public class RegisterModel
{
public string UserName { get ; set ; }
public string EmailAddress { get ; set ; }
public string ConfirmPassword { get ; set ; }
}... และ "Metadata Humanizer" จะดูแลส่วนที่เหลือ
ไม่จำเป็นต้องพูดถึงว่าหากคุณต้องการปลอกชื่อสำหรับฉลากของคุณคุณสามารถใช้วิธีการด้วย Transform :
modelMetadata . DisplayName = modelMetadata . PropertyName . Humanize ( ) . Transform ( To . TitleCase ) ; Humanizer เป็นห้องสมุดคลาสแบบพกพา ขณะนี้มีปัญหาหากคุณพยายามใช้ PCL ในมุมมอง MVC เนื่องจากมุมมอง MVC ไม่ได้แชร์ระบบบิลด์เดียวกันกับโครงการปกติ คุณต้องระบุการอ้างอิงทั้งหมดในไฟล์ web.config รวมถึงระบบโครงการโดยปกติจะเพิ่มโดยอัตโนมัติ
หากคุณพบข้อผิดพลาดที่บอกว่าคุณต้องเพิ่มการอ้างอิงไปยัง System.Runtime หรือ System.Globalization สิ่งนี้จะใช้กับคุณ วิธีแก้ปัญหาคือการเพิ่มการอ้างอิงสัญญาไปยัง web.config ของคุณตามที่ระบุไว้ที่นี่ โปรดทราบว่าสิ่งนี้ใช้กับ PCL ใด ๆ ที่คุณใช้ในมุมมอง MVC ไม่ใช่แค่ Humanizer
โครงการ Humanizer สร้างและทดสอบอย่างต่อเนื่องโดย Azure DevOps (รายละเอียดเพิ่มเติมที่นี่) ที่ใช้กับการดึงคำขอด้วย ไม่นานหลังจากที่คุณส่ง PR คุณสามารถตรวจสอบการแจ้งเตือนการสร้างและทดสอบสถานะในการประชาสัมพันธ์ของคุณ
สถานะการสร้างปัจจุบันบนเซิร์ฟเวอร์ CI คือ
ด้านล่างนี้เป็นรายการของโครงการโอเพนซอร์สที่เกี่ยวข้อง:
หากใช้ Resharper คำอธิบายประกอบสำหรับ Humanizer นั้นมีอยู่ในแพ็คเกจ Humanizer.Annotations ซึ่งคุณสามารถรับได้ผ่านตัวจัดการส่วนขยาย Resharper คำอธิบายประกอบเหล่านี้ยังไม่ครอบคลุมทั้งห้องสมุด แต่ยินดีต้อนรับคำขอดึงเสมอ!
PowerShell Humanizer เป็นโมดูล PowerShell ที่ห่อหุ้มมนุษย์
Humanizer.jvm เป็นการปรับกรอบ Humanizer สำหรับ. NET ซึ่งสร้างขึ้นสำหรับ JVM และเขียนใน Kotlin Humanizer.jvm ตรงตามความต้องการ JVM ทั้งหมดของคุณสำหรับการจัดการและแสดงสตริง enums วันที่เวลาเวลาจำนวนและปริมาณ
Humanizer.node เป็นพอร์ต TypeScript ของ Humanizer Framework
ไอคอนที่สร้างโดย Tyrone Rieschiek