الإنسانيلبي Humanizer جميع احتياجات .NET الخاصة بك لمعالجة وعرض السلاسل ، التعدادات ، التواريخ ، الأوقات ، الزمنات ، الأرقام والكميات.
يمكنك تثبيت Humanizer كحزمة nuget:
اللغة الإنجليزية فقط : Humanizer.Core
جميع اللغات: Humanizer
يتم دعم الأطر التالية: Net4.8 و Net6 و Net7 و Net8
ملاحظة: يستهدف Nuget أيضًا netstandard2. هذا لتمكين السيناريو حيث يلزم NetStandard2. على سبيل المثال محللات Roslyn أو مهام MSBuild. لا يتم دعم الأطر الأخرى (بخلاف القائمة المذكورة أعلاه) التي يمكن أن تستهلك NetStandard2 (مثال Net4.6.1 إلى صافي 4.7.2). على سبيل المثال Net4.6.1 حتى إلى Net4.7.2 غير مدعوم.
كما يتم فهرسة رموز Humanizer مع Sourcelink ويتم تضمينها في الحزمة حتى تتمكن من التنقل عبر رمز Humanizer أثناء تصحيح رمزك.
يمكنك اختيار الحزم بناءً على حزمة (حزمة) Nuget التي تقوم بتثبيتها. بشكل افتراضي ، تقوم حزمة 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"واجهة برمجة تطبيقات
LetterCasingوالطرق التي تقبلها هي إرث من عصر V0.2 وسيتم إهمالها في المستقبل. بدلاً من ذلك ، يمكنك استخدام طريقةTransformالموضحة أدناه.
مثلما يمكنك أن تضفي على كمية إنسانية الكمبيوتر إلى سلسلة صديقة للإنسان ، يمكنك تجريد سلسلة ودية إنسانية إلى واحدة صديقة للكمبيوتر:
"Pascal case input string is turned into sentence" . Dehumanize ( ) => "PascalCaseInputStringIsTurnedIntoSentence" هناك طريقة Transform تحل محل LetterCasing ، ApplyCase Humanize الأحمال الزائدة التي تقبل LetterCasing . توقيع طريقة التحويل كما يلي:
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 هو تعداد وأنت تقتصر على استخدام ما هو موجود في الإطار في حين أن IStringTransformer هي واجهة يمكنك تنفيذها في قاعدة الشرف الخاصة بك مرة واحدة واستخدامها مع طريقة 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 مباشرة على أعضاء التعداد إلى أقل من الإخراج المثالي للمستخدمين. عادةً ما يكون الحل لهذا هو استخدام شرح بيانات DescriptionAttribute ثم قراءة ذلك في وقت التشغيل للحصول على مخرج أكثر ودية. هذا حل رائع. ولكن في أكثر الأحيان ، نحتاج فقط إلى وضع بعض المساحة بين كلمات عضو التعداد - وهو ما يفعله String.Humanize() بشكل جيد. للحصول على تعداد مثل:
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 للحصول على وصف مخصص. أي سمة يتم تطبيقها على أعضاء التعداد مع تعداد خاصية string Description . هذا للمساعدة في المنصات ذات DescriptionAttribute المفقود وأيضًا للسماح بالفئات الفرعية من DescriptionAttribute .
يمكنك حتى تكوين اسم خاصية Attibute لاستخدامها كوصف.
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نأمل أن يساعد هذا في تجنب التعدادات القمامة بسمات غير ضرورية!
تجريد السلسلة في التعداد الذي كان في الأصل أنسنة! تبدو واجهة برمجة التطبيقات:
public static TTargetEnum DehumanizeTo < TTargetEnum > ( this string input )والاستخدام هو:
"Member without description attribute" . DehumanizeTo < EnumUnderTest > ( ) => EnumUnderTest . MemberWithoutDescriptionAttribute ومثل API Humanized ، فإنه يكرم سمة Description . ليس عليك تقديم الغلاف الذي قدمته أثناء الإنسان: إنه يحدد ذلك.
هناك أيضًا نظير غير عام عندما لا يُعرف التعداد الأصلي في وقت الترجمة:
public static Enum DehumanizeTo ( this string input , Type targetEnum , NoMatch onNoMatch = NoMatch . ThrowsException )التي يمكن استخدامها مثل:
"Member without description attribute" . DehumanizeTo ( typeof ( EnumUnderTest ) ) => EnumUnderTest . MemberWithoutDescriptionAttribute بشكل افتراضي ، يرمي كلتا الطريقتين NoMatchFoundException عندما لا يمكنهم مطابقة المدخلات المقدمة مقابل التعداد الهدف. في الأسلوب غير العام ، يمكنك أيضًا طلب طريقة إرجاع 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 ). يمكنك أيضًا توفير التاريخ الذي تريد مقارنة تاريخ الإدخال به. إذا كانت لاغية ، فسيستخدم التاريخ الحالي كقاعدة للمقارنة. أيضا ، يمكن تحديد الثقافة لاستخدامها بشكل صريح. إذا لم يكن الأمر كذلك ، فسيتم استخدام ثقافة واجهة المستخدم الحالية للمعلومات الحالية. هنا هو توقيع 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 لا يتم حسابها نحو دقة القيمة التي تم إرجاعها. إذا لم يكن هذا السلوك مطلوبًا بالنسبة لك ، فيمكنك استخدام طريقة TimeSpan.Humanize 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"يمكن تحديد الثقافة للاستخدام بشكل صريح. إذا لم يكن الأمر كذلك ، فسيتم استخدام ثقافة واجهة المستخدم الحالية للمعلومات الحالية. مثال:
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.)
يمكنك توفير تنسيق مجموعتك الخاصة من خلال تطبيق 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 . Ordinalize ( ) => "1st"
5 . Ordinalize ( ) => "5th" يمكنك أيضًا استدعاء Ordinalize على سلسلة رقمية وتحقيق نفس النتيجة: "21".Ordinalize() => "21st"
يدعم Ordinalize أيضًا الجنس النحوي لكلا النموذجين. يمكنك تمرير وسيطة Ordinalize لتحديد النوع الاجتماعي GrammaticalGender.Neuter يجب إخراجه. القيم المحتملة هي GrammaticalGender.Masculine GrammaticalGender.Feminine
// 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 كلمات الإدخال إلى UpperCamelcase ، وأيضًا إزالة الساحرة والمسافات:
"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 واجهة برمجة تطبيقات بطلاقة للتعامل مع 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 )لا توجد واجهات برمجة تطبيقات بطلاقة لمدة شهر أو سنة حيث يمكن أن يكون الشهر ما بين 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 واجهة برمجة تطبيقات بطلاقة تنتج أعدادًا (عادةً ما تكون كبيرة) بطريقة أوضح:
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.Feminine GrammaticalGender ، إلى ToWords لتحديد أي جنس يجب إخراج الرقم فيه. القيم المحتملة هي GrammaticalGender.Masculine 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 ( ) => "ناقص واحد"من الواضح أن هذا ينطبق فقط على بعض الثقافات. بالنسبة للآخرين الذين يمررون الجنس لا يحدث أي فرق في النتيجة.
أيضا ، يمكن تحديد الثقافة لاستخدامها بشكل صريح. إذا لم يكن الأمر كذلك ، فسيتم استخدام ثقافة واجهة المستخدم الحالية للمعلومات الحالية. هذا مثال:
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.Neuter GrammaticalGender.Masculine GrammaticalGender.Feminine
// 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 ) => "الثاني"من الواضح أن هذا ينطبق فقط على بعض الثقافات. بالنسبة للآخرين الذين يمررون الجنس لا يحدث أي فرق في النتيجة.
أيضا ، يمكن تحديد الثقافة لاستخدامها بشكل صريح. إذا لم يكن الأمر كذلك ، فسيتم استخدام ثقافة واجهة المستخدم الحالية للمعلومات الحالية. هذا مثال:
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"هذا نوع من امتداد OrdInize
// 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.Genitive GrammaticalCase.Nominative GrammaticalGender.Prepositional GrammaticalCase.Dative ، GrammaticalCase.Accusative GrammaticalCase.Instrumental
من الواضح أن هذا ينطبق فقط على بعض الثقافات. بالنسبة للآخرين ، لا يحدث أي فرق في النتيجة.
يمتد الوقت فقط للسماح للإنسانية بتدوين الساعة
// 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 أسهل وأكثر اتساقًا مع API Humanizer. فيما يلي بعض الأمثلة على كيفية التحويل من الأرقام إلى أحجام البايت وبين أحجام الحجم:
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 يمكنك أيضًا توفير تنسيق لتمثيل السلسلة المتوقع. يمكن أن يحتوي التنسيق على رمز القيمة لعرضه: 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 في حين أن النتيجة ستكون سلسلة. يمكنك اختيار ما إذا كنت تريد إرجاع تمثيل كامل للعنصر (على سبيل المثال الشمال أو الشرق أو الجنوب أو الغرب) ، أو تمثيل قصير (على سبيل المثال ، 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 درجة.
من أجل استرداد العنوان بناءً على تمثيل النص القصير (على سبيل المثال ، E ، S ، W) ، يمكن استخدام الطريقة التالية:
"S" . FromShortHeading ( ) ;
// 180
"SW" . FromShortHeading ( ) ;
// 225 يمكن لـ Humanizer تغيير الأرقام الكاملة إلى "tuple" باستخدام Tupleize . على سبيل المثال:
1 . Tupleize ( ) ;
// single
3 . Tupleize ( ) ;
// triple
100 . Tupleize ( ) ;
// centupleسيتم تحويل الأرقام 1-10 و 100 و 1000 إلى "تول" المسماة (أي "Single" ، "Double" وما إلى ذلك). سيتم تحويل أي رقم آخر "N" إلى "n-tuple".
يمكن لـ Humanizer ترجمة وحدات الوقت إلى رموزهم:
TimeUnit . Day . ToSymbol ( ) ;
// d
TimeUnit . Week . ToSymbol ( ) ;
// week
TimeUnit . Year . ToSymbol ( ) ;
// y هذا مجرد خط أساسي ويمكنك استخدام هذا لتبسيط وظيفتك اليومية. على سبيل المثال ، في ASP.NET MVC ، نستمر في سمة Display الخشن على خصائص ViewModel حتى يتمكن HtmlHelper من إنشاء ملصقات صحيحة لنا ؛ ولكن ، تمامًا مثل التعدادات ، في الغالبية العظمى من الحالات ، نحتاج فقط إلى مساحة بين الكلمات في اسم الخاصية - فلماذا لا تستخدم "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 ; }
}... و "البيانات الوصفية البشرية" سوف تعتني بالباقي.
لا داعي للذكر أنه إذا كنت تريد غلاف العنوان لتسمياتك ، فيمكنك توصيل الطريقة مع 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 (مزيد من التفاصيل هنا). ينطبق على طلبات السحب أيضًا. بعد فترة وجيزة من إرسال العلاقات العامة ، يمكنك التحقق من إشعار حالة البناء والاختبار على العلاقات العامة الخاصة بك.
حالة البناء الحالية على خادم CI
فيما يلي قائمة بمشاريع المصادر المفتوحة ذات الصلة:
إذا كنت تستخدم Resharper ، فإن التعليقات التوضيحية لـ Humanizer متوفرة في حزمة Humanizer.annotations ، والتي يمكنك الحصول عليها عبر مدير تمديد Resharper. لا تغطي هذه التعليقات التوضيحية المكتبة بأكملها بعد ، لكن طلبات السحب هي دائمًا موضع ترحيب!.
PowerShell Humanizer هي وحدة PowerShell التي تلتف Humanizer.
Humanizer.JVM هو تكيف مع إطار Humanizer لـ .NET الذي تم صنعه لـ JVM ويتم كتابته في Kotlin. Humanizer.JVM تلبي جميع احتياجات JVM الخاصة بك لمعالجة وعرض السلاسل ، التعداد ، التواريخ ، الأوقات ، الزمنات ، الأرقام والكميات.
Humanizer.node هو منفذ typextript لإطار Humanizer.
أيقونة تم إنشاؤها بواسطة Tyrone Rieschiek