تبدیل conv
تبدیل عدد و مقدار منطقی به متن و برعکس، با پشتیبانی از رقمهای فارسی و خطا برای متنی که عدد نیست.
واردسازی تبدیل
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
متنی که از کاربر، پرونده یا شبکه میرسد همیشه رشته است؛ برای حساب کردن باید آن را به عدد تبدیل کنید، و برای نمایش نتیجه دوباره به متن. بستهی تبدیل هر دو سوی این کار را انجام میدهد.
تابعهای تجزیه رقمهای فارسی (۰۱۲۳۴۵۶۷۸۹) و عربی (٠١٢٣٤٥٦٧٨٩) را هم میفهمند، پس عددی که کاربر فارسیزبان تایپ میکند بیدردسر خوانده میشود. فاصله، تب و شکست خط در دو سوی متن نادیده گرفته میشود و یک علامت + یا - میتواند اول بیاید. هر چیز دیگری باعث میشود تابع به جای حدس زدن یک خطا پرتاب کند: رشتهی خالی، نویسهی اضافه مثل abc در 12abc، علامتی که رقمی پس از آن نیست، یا عددی که در نوعش جا نمیشود. خطا را با تلاش: ... گرفتن خطا خ: بگیرید، یا در تابعی که خودش خطادار است با تلاش به بالا بفرستید.
اگر مقدار نادرست باید بیسروصدا به یک پیشفرض تبدیل شود، شکل «با پیش فرض» همان تابع را به کار ببرید: تجزیه عدد با پیش فرض، رشته به عدد با پیش فرض، تجزیه اعشار با پیش فرض، تجزیه منطقی با پیش فرض و تجزیه شانزده با پیش فرض مقدار جایگزین را در آرگومان دوم میگیرند و هیچوقت خطا پرتاب نمیکنند.
قالب بندی نیمهی قالببندی همین بسته را با پرکردن و قالب رشته در اختیارتان میگذارد؛ وقتی به نیمهی تجزیه یا یکی از سه قالب اعشاری پایین نیاز دارید، سراغ تبدیل بیایید. تابعهای رشتهای به صحیح و به اعشار همان خوانندههای قدیمی و سهلگیرند: چیزی گزارش نمیدهند و برای متنی که عدد نیست صفر برمیگردانند، پس برای هر چیزی که کاربر تایپ کرده تابعهای همین بسته را ترجیح دهید.
چند نکته که معمولاً غافلگیر میکند:
رشته به عددیکصحیحبرمیگرداند که ۳۲ بیتی است؛ پسرشته به عدد("3000000000")خطایخارج از بازهپرتاب میکند. برای شناسه، اندازه و برچسب زمانیتجزیه عددرا به کار ببرید.- جداکننده رقم نیست:
1_000،1 000و1,000همه خطا میدهند و ممیز هم درتجزیه عددخطاست. تجزیه منطقیبه بزرگی و کوچکی حرف حساس است:TrueوYESخطا میدهند.- ویرگول جداکنندهی اعشار نیست:
تجزیه اعشار("1,5")خطا میدهد. ممیز فارسی٫پذیرفته است. - خطا جای مشکل را میگوید.
خ.نوعیکی ازنحووخارج از بازهاست،خ.کدیکی ازconv.empty،conv.no_digits،conv.invalid_char،conv.not_boolوconv.overflow، وخ.جایگاه،خ.خطوخ.ستونبه نویسهی نادرست اشاره میکنند.
رد کردن ورودی نادرست کاربر
یک فرم باید 12abc یا فیلد خالی را نپذیرد و به کاربر بگوید چرا. تجزیه عدد این بررسی را خودش انجام میدهد: آن را در تلاش: بگذارید و پیام خطا را نشان دهید.
واردسازی تبدیل
تابع ریشه:
هر نوشته در ["42"، " ۱۴۰۳ "، "+7"، "12abc"، ""، "-0015"، "99999999999999999999"]:
تلاش:
ع := تبدیل.تجزیه عدد(نوشته)
سرچاپ "[" + نوشته + "]"، "یعنی"، ع
گرفتن خطا خ:
سرچاپ "[" + نوشته + "]"، "پذیرفته نشد:"، خ.پیام، "در ستون"، خ.ستون
پایان
پایان
پایانرقمهای فارسی و فاصلههای دور ۱۴۰۳ همانطور که هستند پذیرفته میشوند و صفرهای پیشرو، مثل -0015، هم اشکالی ندارند. خ.پیام نویسهای را که عدد را خراب کرده نام میبرد و خ.ستون جایش را میگوید تا کاربر پیدایش کند. عددی بیرون از بازهی ۶۴ بیتی خطای خارج از بازه میدهد، نه مقداری که دور زده باشد.
جمع زدن عددهایی با رقمهای گوناگون
متنی که از جاهای مختلف چسبانده میشود اغلب رقم انگلیسی، فارسی و عربی را با هم دارد و ممیز را گاهی . و گاهی جداکنندهی فارسی ٫ مینویسد. تابعهای تجزیه همهی اینها را میپذیرند، پس پیش از محاسبه هیچ پاکسازیای لازم نیست.
واردسازی تبدیل
واردسازی رشته
تابع ریشه خطادار:
خط := "۱۲ 7 ٣٠ 4.5 ۰٫۵"
تکهها := رشته.واژه ها(خط)
دیرکن تکهها.آزادکن()
ناپایا جمع صحیح := ۰ برگردان صحیح۶۴
ناپایا جمع دقیق := ۰.۰
هر تکه در تکهها:
جمع صحیح += تبدیل.تجزیه عدد با پیش فرض(تکه، ۰)
جمع دقیق += تلاش تبدیل.تجزیه اعشار(تکه)
پایان
سرچاپ "تعداد عددها:"، تکهها.طول()
سرچاپ "جمع بخشهای صحیح:"، جمع صحیح
سرچاپ "جمع دقیق:"، تبدیل.قالب اعشار کوتاه(جمع دقیق)
پایانعدد صحیح ممیز ندارد، پس تجزیه عدد متنهای 4.5 و ۰٫۵ را نمیپذیرد؛ اینجا تجزیه عدد با پیش فرض آنها را صفر حساب میکند و برای همین دو جمع با هم فرق دارند. هر جا مقدار ممکن است بخش اعشاری داشته باشد، از تجزیه اعشار استفاده کنید. قالب اعشار کوتاه نتیجه را بدون .0 اضافه یا دنبالهی بلند رقمها چاپ میکند.
مقدار منطقی و شانزدهشانزدهی از پروندهی تنظیمات
پروندههای تنظیمات کلیدهای روشن و خاموش را به شکلهای زیادی مینویسند. تجزیه منطقی مقدارهای true، 1، yes و on را درست و false، 0، no و off را نادرست میخواند، با حروف کوچک و هر فاصلهای دورشان؛ هر چیز دیگری خطا میدهد. اگر کلیدی که اشتباه نوشته شده باید خاموش بماند، تجزیه منطقی با پیش فرض با پیشفرض نادرست همین کار را میکند. تجزیه شانزده رنگ، نقاب بیتی و شناسههایی را که در مبنای شانزده نوشته شدهاند، با حرف کوچک یا بزرگ، میخواند.
واردسازی تبدیل
واردسازی رشته
تابع ریشه خطادار:
خام := نگاشت {} برگردان نگاشت<رشته، رشته>
دیرکن خام.آزادکن()
خام.درج("اشکالزدایی"، " yes ")
خام.درج("حافظه نهان"، "0")
خام.درج("رنگ"، "#1E90FF")
خام.درج("سقف"، "۲۵۰")
خام.درج("فشردهسازی"، "Yes")
اشکال زدایی := تلاش تبدیل.تجزیه منطقی(خام.بگیر("اشکالزدایی"))
نهان := تلاش تبدیل.تجزیه منطقی(خام.بگیر("حافظه نهان"))
فشرده := تبدیل.تجزیه منطقی با پیش فرض(خام.بگیر("فشردهسازی")، نادرست)
رنگ := تلاش تبدیل.تجزیه شانزده(رشته.حذف پیشوند(خام.بگیر("رنگ")، "#"))
سقف := تلاش تبدیل.رشته به عدد(خام.بگیر("سقف"))
سرچاپ "اشکالزدایی:"، تبدیل.قالب منطقی(اشکال زدایی)، "حافظهی نهان:"، تبدیل.قالب منطقی(نهان)، "فشردهسازی:"، تبدیل.قالب منطقی(فشرده)
سرچاپ "سرخ:"، رنگ >> ۱۶، "سبز:"، (رنگ >> ۸) & ۲۵۵، "آبی:"، رنگ & ۲۵۵
سرچاپ "دو برابر سقف:"، سقف * ۲
سرچاپ "رنگ دوباره در مبنای شانزده:"، تبدیل.قالب شانزده(رنگ برگردان طبیعی۶۴)
پایانپیشوند 0x برای تجزیه شانزده اختیاری است (شکل بزرگ 0X خطا میدهد) و # هم خطا میدهد؛ پس اول با رشته.حذف پیشوند بریده میشود. بعد جابهجایی بیتی و نقاب، سه کانال رنگ را از همان یک عدد بیرون میکشند.
انتخاب قالب برای عدد اعشاری
عدد اعشاری را میشود به سه شکل به متن تبدیل کرد و هر کدام به کاری میآید. قالب اعشار هر رقمی را که برای خواندن دوبارهی دقیقاً همان عدد لازم است مینویسد؛ برای پروندهای که برنامهی دیگری میخواندش همین را میخواهید. قالب اعشار کوتاه مثل %g در C تا شش رقم معنادار گرد میکند و همان چیزی را مینویسد که آدم انتظار دارد ببیند. قالب اعشار با دقت تا تعداد ثابتی رقم اعشار گرد میکند، برای پول و گزارش.
واردسازی تبدیل
تابع ریشه خطادار:
قیمت := ۰.۱ * ۳.۰
سرچاپ "قالب اعشار: "، تبدیل.قالب اعشار(قیمت)
سرچاپ "قالب اعشار کوتاه: "، تبدیل.قالب اعشار کوتاه(قیمت)
سرچاپ "قالب اعشار با دقت: "، تبدیل.قالب اعشار با دقت(قیمت، ۲)
برگشتی := تلاش تبدیل.تجزیه اعشار(تبدیل.قالب اعشار(قیمت))
سرچاپ "رفت و برگشت دقیق است:"، برگشتی == قیمت
کوتاه := تلاش تبدیل.تجزیه اعشار(تبدیل.قالب اعشار کوتاه(قیمت))
سرچاپ "شکل کوتاه دقیق است: "، کوتاه == قیمت
سرچاپ تبدیل.قالب اعشار با دقت(۱.۰ / ۳.۰، ۴)، تبدیل.قالب اعشار کوتاه(1e21)
پایانخروجی این بدهبستان را نشان میدهد: شکل کوتاه ۰.۱ * ۳.۰ به صورت 0.3 خوانده میشود، اما تجزیهی همان متن عددی کمی متفاوت میدهد. داده را با قالب اعشار ذخیره کنید و با یکی از دو تای دیگر نمایش دهید.
| هدف | تابع |
|---|---|
| ذخیرهی مقدار برای خواندن دوباره | قالب اعشار |
| نمایش مقدار به کاربر | قالب اعشار کوتاه |
| قیمت، درصد، ستونهای همتراز | قالب اعشار با دقت |
| تشخیص NaN پس از تجزیه | نامعتبر است |
تابعها
قالب عدد بی علامت FormatUint
تابع قالب عدد بی علامت(x: طبیعی۶۴): رشتهواردسازی تبدیل
تابع ریشه:
سرچاپ تبدیل.قالب عدد(-۱۲۰۰)
سرچاپ تبدیل.قالب عدد بی علامت(۱۸۴۴۶۷۴۴۰۷۳۷۰۹۵۵۱۶۱۵ برگردان طبیعی۶۴)
سرچاپ تبدیل.قالب منطقی(نادرست)
سرچاپ تبدیل.قالب شانزده(۴۰۹۶ برگردان طبیعی۶۴)
پایانقالب عدد FormatInt
تابع قالب عدد(n: صحیح۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
قالب منطقی FormatBool
تابع قالب منطقی(b: منطقی): رشتهدرست را به "true" و نادرست را به "false" تبدیل میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
قالب اعشار FormatFloat
تابع قالب اعشار(x: اعشار۶۴): رشتهواردسازی تبدیل
تابع ریشه خطادار:
ع := تلاش تبدیل.تجزیه اعشار("۳٫۷۵")
سرچاپ ع * ۲
سرچاپ تبدیل.قالب اعشار(۰.۱ + ۰.۲)
سرچاپ تبدیل.قالب اعشار کوتاه(۰.۱ + ۰.۲)
سرچاپ تبدیل.قالب اعشار با دقت(۲.۰ / ۳.۰، ۳)
ن := تلاش تبدیل.تجزیه اعشار("nan")
سرچاپ تبدیل.نامعتبر است(ن)، تبدیل.نامعتبر است(ع)
پایانخواندن اعشار ScanFloat
تابع خواندن اعشار(s: رشته): اعشار۶۴"12abc" را 12 میخواند و متنی که عددی در آن نیست 0 میدهد. این همان خوانندهی بدون بررسی پشت تجزیه اعشار است؛ وقتی ورودی بد باید خطا باشد از تجزیه اعشار استفاده کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
قالب عدد بی علامت FormatUint
تابع قالب عدد بی علامت(x: طبیعی۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
قالب عدد FormatInt
تابع قالب عدد(n: صحیح۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
قالب منطقی FormatBool
تابع قالب منطقی(b: منطقی): رشتهدرست را به "true" و نادرست را به "false" تبدیل میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
تجزیه منطقی ParseBool
تابع تجزیه منطقی(s: رشته): Throws<منطقی>"true"، "1"، "yes" و "on" درستاند و "false"، "0"، "no" و "off" نادرست، با فاصلهی اضافه در دو سو. هر چیز دیگری خطای نحو پرتاب میکند (کد conv.not_bool، یا conv.empty برای رشتهی خالی). بزرگی و کوچکی حرف مهم است، پس "True" خطا میدهد.واردسازی تبدیل
تابع ریشه خطادار:
سرچاپ تلاش تبدیل.تجزیه عدد(" -۲۷ ")، تلاش تبدیل.تجزیه عدد("-27")
سرچاپ تلاش تبدیل.رشته به عدد("+15")
سرچاپ تلاش تبدیل.تجزیه شانزده("0xff")، تلاش تبدیل.تجزیه شانزده("1A")
سرچاپ تلاش تبدیل.تجزیه منطقی("yes")، تلاش تبدیل.تجزیه منطقی(" off ")
تلاش:
_ := تبدیل.تجزیه عدد("12abc")
گرفتن خطا خ:
سرچاپ خ.نام نوع()، خ.کد، خ.ستون، خ.به رشته()
پایان
تلاش:
_ := تبدیل.رشته به عدد("3000000000")
گرفتن خطا خ:
سرچاپ خ.است(نوع خطا.خارج از بازه)، خ.پیام
پایان
پایانتجزیه منطقی با پیش فرض ParseBoolOr
تابع تجزیه منطقی با پیش فرض(s: رشته، fallback: منطقی): منطقیتجزیه منطقی است، ولی به جای پرتاب خطا آرگومان دوم را برمیگرداند.واردسازی تبدیل
تابع ریشه:
سرچاپ تبدیل.تجزیه عدد با پیش فرض("12abc"، ۰)، تبدیل.تجزیه عدد با پیش فرض(" ۴۲ "، ۰)
سرچاپ تبدیل.رشته به عدد با پیش فرض(""، ۸۰۸۰)، تبدیل.رشته به عدد با پیش فرض("443"، ۸۰۸۰)
سرچاپ تبدیل.تجزیه اعشار با پیش فرض("n/a"، ۰.۵)، تبدیل.تجزیه اعشار با پیش فرض("۱٫۲۵"، ۰.۵)
سرچاپ تبدیل.تجزیه منطقی با پیش فرض("True"، نادرست)، تبدیل.تجزیه منطقی با پیش فرض("on"، نادرست)
سرچاپ تبدیل.تجزیه شانزده با پیش فرض("#fff"، -۱)، تبدیل.تجزیه شانزده با پیش فرض("ff"، -۱)
پایانتجزیه عدد ParseInt
تابع تجزیه عدد(s: رشته): Throws<صحیح۶۴>صحیح۶۴) میخواند. فاصلههای دو سو نادیده گرفته میشوند و یک علامت + یا - میتواند اول بیاید؛ رقم فارسی، عربی و انگلیسی همه قبولاند، حتی درهم. برای رشتهی خالی، علامتی که رقمی پس از آن نیست یا هر نویسهی دیگری (ممیز، جداکننده، حرف) خطای نحو با جایگاه، خط و ستون همان نویسه پرتاب میکند، و اگر عدد در ۶۴ بیت جا نشود خارج از بازه (کد conv.overflow).نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseInt.salam
تجزیه عدد با پیش فرض ParseIntOr
تابع تجزیه عدد با پیش فرض(s: رشته، fallback: صحیح۶۴): صحیح۶۴تجزیه عدد است، ولی به جای پرتاب خطا آرگومان دوم را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseIntOr.salam
رشته به عدد Atoi
تابع رشته به عدد(s: رشته): Throws<صحیح>تجزیه عدد است، ولی یک صحیح برمیگرداند که ۳۲ بیتی است؛ عددی بیرون از این بازه خطای خارج از بازه میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseInt.salam
رشته به عدد با پیش فرض AtoiOr
تابع رشته به عدد با پیش فرض(s: رشته، fallback: صحیح): صحیحرشته به عدد است، ولی به جای پرتاب خطا آرگومان دوم را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseIntOr.salam
تجزیه اعشار ParseFloat
تابع تجزیه اعشار(s: رشته): Throws<اعشار۶۴>2.5e3، ممیز در اول یا آخر (.5، 5.)، inf، infinity و nan با هر شکل حروف، و رقمهای فارسی با ممیز فارسی (۳٫۷۵) همه پذیرفتهاند، با فاصله در دو سو. ویرگول، ممیز دوم، توان بیرقم یا هر نویسهی دیگری خطای نحو میدهد و عددی که برای اعشاری ۶۴ بیتی بزرگ است خارج از بازه. عددی که آنقدر کوچک است که نمایش داده نمیشود صفر میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
تجزیه اعشار با پیش فرض ParseFloatOr
تابع تجزیه اعشار با پیش فرض(s: رشته، fallback: اعشار۶۴): اعشار۶۴تجزیه اعشار است، ولی به جای پرتاب خطا آرگومان دوم را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseIntOr.salam
نامعتبر است IsNaNF
تابع نامعتبر است(x: اعشار۶۴): منطقی"nan". هیچ مقایسهای با == این حالت را تشخیص نمیدهد، چون NaN با خودش هم برابر نیست.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
قالب اعشار FormatFloat
تابع قالب اعشار(x: اعشار۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
قالب اعشار کوتاه FormatFloatShort
تابع قالب اعشار کوتاه(x: اعشار۶۴): رشته%g در C: 0.1 + 0.2 میشود 0.3 و 3.14159265 میشود 3.14159. از یک میلیون به بالا و زیر 0.0001 به نمایش توانی میرود؛ پس 1234567.0 میشود 1.23457e+06.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
قالب اعشار با دقت FormatFloatPrec
تابع قالب اعشار با دقت(x: اعشار۶۴، prec: صحیح): رشتهقالب اعشار سپرده میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseFloat.salam
قالب شانزده FormatHex
تابع قالب شانزده(x: طبیعی۶۴): رشته0x.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-FormatInt.salam
تجزیه شانزده ParseHex
تابع تجزیه شانزده(s: رشته): Throws<صحیح۶۴>0x اختیاری است و رقمهای شانزدهشانزدهی با حرف کوچک و بزرگ هر دو قبولاند، اما خود پیشوند باید 0x با حرف کوچک باشد؛ فاصلههای دو سو نادیده گرفته میشوند و علامت پذیرفته نیست. تا ۱۶ رقم جا میشود؛ مقدار بزرگتر از 7fffffffffffffff با همان ۶۴ بیت منفی برمیگردد و عدد بلندتر خارج از بازه میدهد. هر نویسهی دیگری خطای نحو پرتاب میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseInt.salam
تجزیه شانزده با پیش فرض ParseHexOr
تابع تجزیه شانزده با پیش فرض(s: رشته، fallback: صحیح۶۴): صحیح۶۴تجزیه شانزده است، ولی به جای پرتاب خطا آرگومان دوم را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: conv-ParseIntOr.salam