আমি কীভাবে কোনও ফ্লোট বা ইন্টিতে একটি স্ট্রিং পার্স করব?


2246

পাইথনে, আমি কীভাবে "545.2222"তার সম্পর্কিত ফ্লোট মানটির মতো একটি সংখ্যার স্ট্রিংকে পার্স করতে পারি 545.2222? বা "31"একটি পূর্ণসংখ্যার স্ট্রিংকে পার্স করবেন 31,?

আমি শুধু জানতে কিভাবে বিশ্লেষণ করতে চান ভাসা str একটি থেকে float, এবং (আলাদাভাবে) একটি int- এ str একটি থেকে int


7
একটি সাধারণ নিয়ম হিসাবে, যদি পাইথনে আপনার কোনও অবজেক্ট থাকে এবং সেই ধরণের অবজেক্টে রূপান্তর করতে চান তবে type(my_object)এটিকে কল করুন। রূপান্তরটি করার জন্য ফলটিকে সাধারণত ফাংশন হিসাবে ডাকা যেতে পারে। উদাহরণস্বরূপ type(100)ফলাফল int, যাতে আপনি পূর্ণসংখ্যায় int(my_object)রূপান্তর my_objectকরার চেষ্টা করতে কল করতে পারেন । এটি সর্বদা কার্যকর হয় না তবে কোডিং করার সময় এটি একটি "প্রথম অনুমান"।
রবার্টলেটন

int(x) if int(x) == float(x) else float(x)
tcpaiva

উত্তর:


2618
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

8
শুধু ভাবছি কেন এখানে '04' আছে? কেন কেবল '00' নয়? এছাড়াও আমার অজগরটির বর্তমান সংস্করণটিতে '04' নেই।
মাংগত রাই মোদী

54
@ মঙ্গাতরাইমোডি ফ্লোটিং পয়েন্ট সংখ্যা দশমিকের প্রতিনিধিত্ব করার জন্য সহজাত অসম্পূর্ণ। আরো জানার জন্য, দেখুন stackoverflow.com/q/21895756/931277
dokkaebi

19
কেন কেবল না int(a)কিন্তু int(float(a))?
idclev 463035818

24
int(a)একটি ত্রুটি দেবে যে স্ট্রিংটি কোনও বৈধ পূর্ণসংখ্যার নয়: ValueError: invalid literal for int() with base 10: '545.222'তবে একটি ফ্লোট থেকে ইনটকে রূপান্তর করা একটি সমর্থিত রূপান্তর।
ডেভিড পার্কস

4
আপনি ValueErrorনিরাপদ থাকতে চাইলে আপনার পরিচালনা করা উচিত
জো ববসন

513
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

81
অন্তর্নিহিত মিশ্রণ ফ্লোট / ইনটসগুলি ফ্লোটগুলির সাথে কাজ করার সময় নির্ভুলতার সম্ভাব্য ক্ষতির কারণে বা /ফ্লোট / ইনসগুলিতে অপারেটরের জন্য বিভিন্ন ফলাফলের জন্য সূক্ষ্ম বাগের দিকে নিয়ে যেতে পারে । প্রসঙ্গের উপর নির্ভর করে অন্তর্ভুক্ত বা ভাসমান উভয়ই নয়, ফিরে আসা ভাল।
jfs

14
@ জেফাসেবাস্টিয়ান আপনি সম্পূর্ণরূপে সঠিক, তবে এমন সময় রয়েছে যখন আপনি ইনপুটটি কোনটি ঠিক করবেন তা নির্ধারণ করতে চান। কোনটি হাঁসের-টাইপিংয়ের সাথে সুন্দরভাবে কাজ করতে পারে তা ইনপুটকে নির্দেশ দেয়।
টিমোথিউজম্যান 21

4
tryযখন আপনি ভাসতে রূপান্তরযোগ্য না হন তখন কোনও ব্যতিক্রম ছুঁড়ে ফেলার জন্য আপনি অন্যকে বাসাতে পারেন।
iBug

2
ব্যর্থs = u'\u0000'
ম্যাট হ্যাঙ্কক

1
@iBug ভাল ধারণা! আমি ValueErrorসংশ্লিষ্টটিতে নিক্ষেপ করার পরামর্শ দিচ্ছি except: পি
মার্সেলেম

511

স্ট্রিংটি ভাসমান কিনা তা পরীক্ষা করার জন্য পাইথন পদ্ধতি:

def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

এই ফাংশনটির জন্য আরও দীর্ঘ এবং আরও সঠিক নাম হতে পারে: is_convertible_to_float(value)

পাইথন কী এবং কোনটি ভাসমান নয় তা আপনাকে অবাক করে দিতে পারে:

val                   is_float(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

আপনি কি মনে করেন আপনি জানেন যে সংখ্যাগুলি কী? আপনি যেমন ভাবেন তেমন ভাল না! বড় চমক নয়।

জীবন-সমালোচনামূলক সফ্টওয়্যারটিতে এই কোডটি ব্যবহার করবেন না!

এইভাবে বিস্তৃত ব্যতিক্রম ধরা, ক্যানারি হত্যা এবং ব্যতিক্রম গবলিং একটি ক্ষুদ্র সম্ভাবনা তৈরি করে যে স্ট্রিং হিসাবে একটি বৈধ ভাসা মিথ্যা ফিরে আসবে। float(...)কোডের লাইন এক হাজার কারণের স্ট্রিং এর বিষয়বস্তু সঙ্গে কিছুই করার আছে জন্য ব্যর্থ পারবেন না। তবে আপনি যদি পাইথনের মতো হাঁস-টাইপিং প্রোটোটাইপ ভাষায় লাইফ-ক্রিটিকাল সফটওয়্যারটি লিখছেন তবে আপনার অনেক বড় সমস্যা হয়েছে।


1
সত্য হয়ে যায় 1, এটাই কি আমি সি ++ থেকে উত্তরাধিকার সূত্রে পাই বলে মনে করি
FindOutIslamNow

6
আমি এই উত্তরটি 2014 সালে পোস্ট করেছিলাম UTF-8a 4স্টকওভারফ্লো বিকাশকারীরা কীভাবে তাদের মাইক্রোসফ্ট সরঞ্জামের স্ট্যাকের উপরে তাদের চরিত্রের এনকোডিং স্কিমটি পরিবর্তন করে তার উপর নির্ভর করে একটি চীনা ভাষার জন্য এই গ্লাইফ বছরের পর বছর ধরে রূপান্তরিত হচ্ছে। নতুন রূপান্তর প্রকল্পগুলি তাদের নতুন মতাদর্শকে দৃ .় করে বলে কয়েক বছরের মধ্যে এটি ফ্লপ ফ্লপ দেখার জন্য একটি কৌতূহল। তবে হ্যাঁ, UTF-8পূর্ব প্রাচ্য সংখ্যার জন্য কোনও গ্লাইফ পাইথন ফ্লোট নয়। Bazinga।
এরিক লেসচিনস্কি

4
এত বড় ব্যতিক্রম ব্যতীত কীভাবে এটিকে এতটা উপভোগ করা যায়?
E.Serra

এর মধ্যে ফাঁকা স্থান সহ সমস্ত কিছু রূপান্তর করা যায় না, যেমন "- 12.3"এবং"45 e6"
সাইমন

1
এটি ধারা বাদে সীমাবদ্ধ করা উচিতTypeError, ValueError
wim

131

এটি অন্য একটি পদ্ধতি যা এখানে উল্লেখ করার যোগ্য, অ্যাস্টাইলাইটাল_ওয়াল :

এটি নিরাপদে মূল্যবোধগুলি বিশ্লেষণ না করে অবিশ্বস্ত উত্স থেকে পাইথন এক্সপ্রেশন যুক্ত স্ট্রিংগুলি নিরাপদে মূল্যায়নের জন্য ব্যবহার করা যেতে পারে।

এটি একটি নিরাপদ 'ইওল'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

11
এটি সমস্যার ভাল সমাধান নয় । পাইথন 2 এ এটি সূক্ষ্মভাবে কাজ করে, তবে পাইথন 3 এ নিম্নলিখিতটি ঘটে: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>> এটি কেন একটি সমস্যা তা স্পষ্ট করার জন্য, আপনি যদি ফোন নম্বরগুলি একা রেখে চান এবং সেগুলি গাণিতিক বহিঃপ্রকাশ বলে ধরে না রাখেন, তবে এই পদ্ধতিটি আপনার পক্ষে নয়।
রাইস 3

6
@ রইস 3 হ্যাঁ, এটি একটি ভাল পয়েন্ট এবং ব্যবহারকারীদের সাবধান হওয়া উচিত। জটিল আক্ষরিক পার্সিংয়ের সাথে কিছু সমস্যা সমাধানের জন্য আচরণটি মূলত সংশোধন করা হয়েছিল। এটি তর্কযোগ্যভাবে একটি বাগ ast.literal_eval, এবং এখানে আলোচনা করা হয়েছে
wim

79
float(x) if '.' in x else int(x)

21
দ্রষ্টব্য: কোনও দেশ দশমিক বিভাজক হিসাবে "," ব্যবহার করে স্ট্রিং হিসাবে পাস করা অর্থের পরিমাণের সাথে লেনদেন করার সময় সাবধান হন
বেন জি

127
@ এমাইল: আমি "2e-3" কে একটি "চরম মামলা" বলব না। এই উত্তরটি কেবল ভেঙে গেছে।
jchl

14
@ বেঞ্জ ভাসা হিসাবে অর্থ হস্তান্তর না। এটা ঝামেলা চাইছে। অর্থের জন্য দশমিক ব্যবহার করুন! (তবে ',' সম্পর্কে আপনার মন্তব্যটি এখনও বৈধ এবং গুরুত্বপূর্ণ)
টুলমেকারস্টিভ

4
ভুলে যাবেন না যে "একটি সংখ্যা নয়" (NaN) এবং +/- অনন্ততাও বৈধ ফ্লোট মান। float("nan")
রনি অ্যান্ডারসন

2
একটি আইপি ঠিকানার মাধ্যমে সহজেই ভাঙ্গনযোগ্য - 192.168.0.1; বা"This is not a good approach. :)"
টডর মিনাকভ

69

স্থানীয়করণ এবং কমা

কোনও সংখ্যার স্ট্রিং উপস্থাপনায় কমা করার সম্ভাবনা আপনার বিবেচনা করা উচিত, যেমন ক্ষেত্রে float("545,545.2222")ব্যতিক্রম ছুঁড়ে দেয়। পরিবর্তে, localeস্ট্রিংগুলিকে সংখ্যায় রূপান্তর করতে এবং কমাগুলি সঠিকভাবে ব্যাখ্যা করতে পদ্ধতিগুলি ব্যবহার করুন । locale.atofলোকেল একবার এক ধাপে একটি float পদ্ধতি ধর্মান্তরিত পছন্দসই নম্বর কনভেনশন জন্য সেট করা হয়েছে।

উদাহরণ 1 - মার্কিন যুক্তরাষ্ট্রের নম্বর কনভেনশন

মার্কিন যুক্তরাষ্ট্র এবং যুক্তরাজ্যে কমা হাজার হাজার বিভাজক হিসাবে ব্যবহার করা যেতে পারে। আমেরিকান লোকালের সাথে এই উদাহরণে, কমাটি বিভাজক হিসাবে সঠিকভাবে পরিচালিত হয়:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

উদাহরণ 2 - ইউরোপীয় সংখ্যা সম্মেলন

বিশ্বের বেশিরভাগ দেশগুলিতে কমাগুলি পিরিয়ডের পরিবর্তে দশমিক চিহ্নের জন্য ব্যবহৃত হয়। ফরাসি লোকালের সাথে এই উদাহরণে কমাটি দশমিক চিহ্ন হিসাবে সঠিকভাবে পরিচালিত হয়:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

পদ্ধতিটিও locale.atoiউপলভ্য, তবে যুক্তিটি পূর্ণসংখ্যা হওয়া উচিত।


এটি একটি আদর্শ সমাধানের মতো মনে হয় যখন আপনি জানেন যে কোনও ফ্লোট বা ইনট ফিরিয়ে দেওয়া উচিত, তবে আপনি কেবল কী কোনও ইন্ট্রাস্ট হয়ে গেলে কেবল কোনও ইন্টি ফেরত পেতে পারেন? উদাহরণস্বরূপ, আমি যখন চাই তখন x = '1'; locale.atof(x)ফিরে আসে । 1.01
ব্যবহারকারী5359531

ডিনোর পদ্ধতিটি ব্যবহার করে, আমি অনুমান করি উত্তরটি এরকম কিছু ব্যবহার করা হবে:locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
ব্যবহারকার 35359531

আমি (মোড়ানো উপরে জাভিয়ের এর পদ্ধতি ব্যবহার করে সুপারিশ করবে locale.atoiকরে দেখুন এবং ব্যবহার locale.atofব্যতিক্রম অন - এটা আরো পাঠযোগ্য সম্ভবত না।
মার্ক Chackerian

27

আপনি যদি তৃতীয় পক্ষের মডিউলগুলিতে বিরক্ত না হন তবে আপনি ফাস্টনম্বার মডিউলটি পরীক্ষা করে দেখতে পারেন । এটি ফাস্ট_রিয়াল নামক একটি ফাংশন সরবরাহ করে যা এই প্রশ্নটি যা জিজ্ঞাসা করছে ঠিক তা করে এবং খাঁটি-পাইথন প্রয়োগের চেয়ে দ্রুত এটি করে:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

24

ব্যবহারকারী কোডেলোগিক এবং হারলে সঠিক, তবে মনে রাখবেন যদি আপনি জানেন যে স্ট্রিংটি একটি পূর্ণসংখ্যা (উদাহরণস্বরূপ, 545) আপনি প্রথমে ভাসা না ফেলে ইন্ট ("545") কল করতে পারেন।

যদি আপনার স্ট্রিং কোনও তালিকায় থাকে তবে আপনি মানচিত্রের কাজটিও ব্যবহার করতে পারেন।

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

যদি তারা সমস্ত একই ধরণের হয় তবেই এটি ভাল।


21

পাইথনে, আমি কীভাবে তার সম্পর্কিত ফ্লোট মান, 542.2222 এর সাথে "545.2222" এর মতো সংখ্যার স্ট্রিংকে পার্স করতে পারি? বা একটি পূর্ণসংখ্যার "31" স্ট্রিংটি 31, পার্স করবেন? আমি কেবল জানতে চাই যে কীভাবে একটি ফ্লোটে একটি ফ্লোট স্ট্রিংকে পার্স করতে হয় এবং (আলাদাভাবে) কোনও ইনটকে একটি স্ট্রিংকে পার্স করতে হয় ars

এটি আলাদা যে আপনি এগুলি আলাদাভাবে করতে বলছেন। আপনি যদি এগুলিকে মিশ্রণ করেন তবে আপনি পরে সমস্যার জন্য নিজেকে স্থাপন করছেন। সহজ উত্তরটি হ'ল:

"545.2222" ভাসা:

>>> float("545.2222")
545.2222

"31" একটি পূর্ণসংখ্যা:

>>> int("31")
31

অন্যান্য রূপান্তর, স্ট্রিং এবং আক্ষরিক থেকে এবং থেকে ints:

বিভিন্ন ঘাঁটি থেকে রূপান্তরগুলি এবং আপনার বেসটি আগাম জানতে হবে (10 টি ডিফল্ট)। দ্রষ্টব্য আপনি পাইথনটি তার আক্ষরিক জন্য কী প্রত্যাশা করে সেগুলি দিয়ে উপসর্গ করতে পারেন (নীচে দেখুন) বা উপসর্গটি সরাতে পারেন:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

আপনি যদি বেসটি আগেই জানেন না, তবে আপনি জানেন যে তাদের সঠিক উপসর্গ থাকবে, আপনি যদি 0বেস হিসাবে পাস করেন তবে পাইথন এটি আপনার জন্য অনুমান করতে পারে :

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

অন্যান্য দশকের অ-দশমিক (অর্থাত্ পূর্ণসংখ্যার) লিটারাল

যদি আপনার প্রেরণাটি আপনার নিজের কোডটি স্পষ্টভাবে হার্ড-কোডেড নির্দিষ্ট মানগুলিকে উপস্থাপন করে, তবে আপনাকে বেসগুলি থেকে রূপান্তর করতে হবে না - আপনি পাইথনকে সঠিক সিনট্যাক্স সহ স্বয়ংক্রিয়ভাবে এটি করতে দিতে পারেন।

আপনি নিম্নলিখিত অক্ষরের সাথে পূর্ণসংখ্যায় স্বয়ংক্রিয় রূপান্তর পেতে অ্যাপ্রোপস উপসর্গ ব্যবহার করতে পারেন । এগুলি পাইথন 2 এবং 3 এর জন্য বৈধ:

বাইনারি, উপসর্গ 0b

>>> 0b11111
31

অক্টাল, উপসর্গ 0o

>>> 0o37
31

হেক্সাডেসিমাল, উপসর্গ 0x

>>> 0x1f
31

বাইনারি পতাকা, কোডে ফাইলের অনুমতি, বা রঙের জন্য হেক্স মানগুলি বর্ণনা করার সময় এটি কার্যকর হতে পারে - উদাহরণস্বরূপ, কোনও উদ্ধৃতি নোট করুন:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

অস্পষ্ট পাইথন 2 অষ্টাল পাইথন 3 এর সাথে সামঞ্জস্যপূর্ণ

আপনি যদি পাইথন 2 এ 0 দিয়ে শুরু করে এমন একটি পূর্ণসংখ্যা দেখতে পান তবে এটি অষ্টাল সিনট্যাক্স (

>>> 037
31

এটি খারাপ কারণ এটি দেখে মনে হচ্ছে মানটি হওয়া উচিত 37। পাইথন 3 এ এটি এখন একটি উত্থাপন করে SyntaxError:

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

আপনার পাইথন 2 টি অক্টালকে 0oউপসর্গের সাহায্যে 2 এবং 3 উভয় ক্ষেত্রেই অষ্টালে রূপান্তর করুন :

>>> 0o37
31

20

প্রশ্নটি কিছুটা পুরানো বলে মনে হচ্ছে। তবে আমাকে একটি ফাংশন, পার্সএসটিআর, যা অনুরূপ কিছু তৈরি করে তা বোঝায়, অর্থাত্ পূর্ণসংখ্যা বা ভাসা ফেরত দেয় এবং প্রদত্ত এএসসিআইআই স্ট্রিং যদি তাদের কোনওটিতে রূপান্তরিত না করা যায় তবে এটি এটিকে ছোঁয়াচে ফিরিয়ে দেয়। অবশ্যই কোডটি আপনার যা করতে চান তা করতে সামঞ্জস্য করা যেতে পারে:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'

8
1e3পাইথনের একটি সংখ্যা, তবে আপনার কোড অনুসারে একটি স্ট্রিং।
সিইস টিমারম্যান

16

float("545.2222") এবং int(float("545.2222"))


1
যদি আপনার স্ট্রিংটি "0" বা "0.0" হয়ে থাকে তবে এটি অন্যান্য বৈধ সংখ্যার চেয়ে আরও বড় আকার দেয় object
ব্রায়ান

14

আমি এই জন্য এই ফাংশন ব্যবহার

import ast

def parse_str(s):
   try:
      return ast.literal_eval(str(s))
   except:
      return

এটি স্ট্রিংটিকে তার ধরণে রূপান্তরিত করবে

value = parse_str('1')  # Returns Integer
value = parse_str('1.5')  # Returns Float

দয়া করে মনে রাখবেন যে parse_str(' 1')(একটি স্থান সহ) ফিরে আসবে None, না 1
মুসিফিল

13

YAML পার্সার আপনি জিনিসটা কি ডাটাটাইপ আপনার স্ট্রিং সাহায্য করতে পারেন। ব্যবহার করুন yaml.load()এবং তারপরে আপনি type(result)টাইপের জন্য পরীক্ষা করতে ব্যবহার করতে পারেন :

>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>

11
def get_int_or_float(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float

1
আপনি exceptযদি সেখানে কিছু না করেন তবে আপনি কেন আপনার বিভাগে বাড়াবেন? ভাসা () আপনার জন্য উত্থাপন করবে।
গ্রেগেরি

1
আপনি ঠিক বলেছেন আমি অনুমান করি যে আমি কোনও কার্যকারিতা থেকে অনুলিপি করে আটকিয়েছি যা আমি একটি বিশেষ ব্যতিক্রম উত্থাপন করছি। সম্পাদনা করবে। ধন্যবাদ
টোটোরো

1
এই একটি স্ট্রিং বিশ্লেষণ এবং হয় ফিরে যাওয়ার চেষ্টা করবে intবা floatকি স্ট্রিং প্রতিনিধিত্ব করে উপর নির্ভর করে। এটি পার্সিং ব্যতিক্রমগুলি বাড়তে পারে বা [কিছু অপ্রত্যাশিত আচরণ থাকতে পারে] [1]।
কুজেকো

9
def num(s):
    """num(s)
    num(3),num(3.7)-->3
    num('3')-->3, num('3.7')-->3.7
    num('3,700')-->ValueError
    num('3a'),num('a3'),-->ValueError
    num('3e4') --> 30000.0
    """
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            raise ValueError('argument is not a string of number')

6

এটি সঠিকভাবে করার জন্য আপনার অ্যাকাউন্টটি রাউন্ডিংয়ে নেওয়া উচিত।

ইন্টি (5.1) => 5 ইনট (5.6) => 5 - ভুল, 6 হওয়া উচিত তাই আমরা ইনট করি (5.6 + 0.5) => 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)

4
ভাল যুক্তি. এটি মুদ্রাস্ফীতি তৈরি করে, যদিও পাইথন 3 এবং অন্যান্য আধুনিক ভাষাগুলি ব্যাংকারদের বৃত্তাকার ব্যবহার করে।
সিইস টিমারম্যান

2
এই উত্তরটি ভুল (মূলত লিখিত) এটা দুটি মামলা গন্ডগোল পাকিয়ে ফেলে intএবং floatnওপি পছন্দসই হিসাবে এটি একটি স্ট্রিং যখন একটি ব্যতিক্রম দেয় । হতে পারে আপনি বোঝানো: যখন একটি intফলাফলের পছন্দসই হয়, roundভাসা সম্পন্ন পরে রূপান্তর হওয়া উচিত। যদি ফাংশনটি সবসময় কোনও int ফিরিয়ে দেয়, তবে আপনার আর অংশের দরকার নেই - পুরো ফাংশন বডি হতে পারে int(round(float(input)))। যদি ফাংশনটি সম্ভব হয় কোনও পূর্বে ফিরে আসা উচিত, অন্যথায় একটি ভাসা, তারপরে জাভিয়ের আসল সমাধানটি সঠিক!
টুলমেকারস্টিভ

5

আমি অবাক হয়েছি কেউ রেজেক্সের কথা উল্লেখ করেনি কারণ কখনও কখনও সংখ্যায় কাস্টিংয়ের আগে স্ট্রিং প্রস্তুত ও স্বাভাবিক করা উচিত

import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

ব্যবহার:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

এবং যাইহোক, আপনার একটি নম্বর আছে যাচাই করার জন্য কিছু:

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal

5

পাইথনে টাইপকাস্ট করতে প্যারামিটার হিসাবে স্ট্রিং (বা আপনি যে মানটি চেষ্টা করতে চাইছেন) পেরিয়ে টাইপের কন্সট্রাক্টর ফান্ট ব্যবহার করুন।

উদাহরণ স্বরূপ:

>>>float("23.333")
   23.333

পর্দার আড়ালে, অজগর বস্তু __float__পদ্ধতিতে কল দিচ্ছে , যা প্যারামিটারের একটি ফ্লোট প্রতিনিধিত্ব ফিরিয়ে আনবে। এটি বিশেষত শক্তিশালী, কারণ আপনি কোনও __float__পদ্ধতি দিয়ে নিজের ধরণের (ক্লাস ব্যবহার করে) সংজ্ঞায়িত করতে পারেন যাতে এটি ভাসা (মায়োবজেক্ট) ব্যবহার করে একটি ফ্লোটে কাস্ট করা যায়।


3

এই সংশোধিত সংস্করণ এর https://stackoverflow.com/a/33017514/5973334

এই একটি স্ট্রিং বিশ্লেষণ এবং হয় ফিরে যাওয়ার চেষ্টা করবে intবা floatকি স্ট্রিং প্রতিনিধিত্ব করে উপর নির্ভর করে। এটি পার্সিং ব্যতিক্রম বা কিছু অপ্রত্যাশিত আচরণ থাকতে পারে

  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else 
        number_as_float

2

আপনার স্ট্রিং এই ফাংশনে পাস করুন:

def string_to_number(str):
  if("." in str):
    try:
      res = float(str)
    except:
      res = str  
  elif(str.isdigit()):
    res = int(str)
  else:
    res = str
  return(res)

এটি কী পাস হয়েছে তার উপর নির্ভর করে ইনট, ফ্লোট বা স্ট্রিং ফিরে আসবে।

স্ট্রিং যে একটি int

print(type(string_to_number("124")))
<class 'int'>

স্ট্রিং যে একটি ভাসা

print(type(string_to_number("12.4")))
<class 'float'>

স্ট্রিং যা একটি স্ট্রিং

print(type(string_to_number("hello")))
<class 'str'>

স্ট্রিং যা দেখতে ভাসমান মতো like

print(type(string_to_number("hel.lo")))
<class 'str'>

1

ব্যবহার করুন:

def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

এটি আমি নিয়ে আসতে পারে সবচেয়ে পাইথোনিক উপায়।


প্রথম ব্যাখ্যার পরে জেনারেটর থামে floattry... catchব্লক সম্ভবত ভিতরে হওয়া উচিত forলুপ।
মুসিফিল

1

হেক্স, অষ্টাল, বাইনারি, দশমিক এবং ভাসমান পরিচালনা করে

এই সমাধানটি সংখ্যার জন্য সমস্ত স্ট্রিং কনভেনশন পরিচালনা করবে (আমি যা জানি তার সবগুলি)।

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

এই পরীক্ষার কেস আউটপুট চিত্রিত করে আমি কী সম্পর্কে বলছি।

======================== CAPTURED OUTPUT =========================
to_number(3735928559)   = 3735928559 == 3735928559
to_number("0xFEEDFACE") = 4277009102 == 4277009102
to_number("0x0")        =          0 ==          0
to_number(100)          =        100 ==        100
to_number("42")         =         42 ==         42
to_number(8)            =          8 ==          8
to_number("0o20")       =         16 ==         16
to_number("020")        =         16 ==         16
to_number(3.14)         =       3.14 ==       3.14
to_number("2.72")       =       2.72 ==       2.72
to_number("1e3")        =     1000.0 ==       1000
to_number(0.001)        =      0.001 ==      0.001
to_number("0xA")        =         10 ==         10
to_number("012")        =         10 ==         10
to_number("0o12")       =         10 ==         10
to_number("0b01010")    =         10 ==         10
to_number("10")         =         10 ==         10
to_number("10.0")       =       10.0 ==         10
to_number("1e1")        =       10.0 ==         10

পরীক্ষাটি এখানে:

class test_to_number(unittest.TestCase):

    def test_hex(self):
        # All of the following should be converted to an integer
        #
        values = [

                 #          HEX
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0xDEADBEEF  , 3735928559), # Hex
                ("0xFEEDFACE", 4277009102), # Hex
                ("0x0"       ,          0), # Hex

                 #        Decimals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (100         ,        100), # Decimal
                ("42"        ,         42), # Decimal
            ]



        values += [
                 #        Octals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0o10        ,          8), # Octal
                ("0o20"      ,         16), # Octal
                ("020"       ,         16), # Octal
            ]


        values += [
                 #        Floats
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (3.14        ,       3.14), # Float
                ("2.72"      ,       2.72), # Float
                ("1e3"       ,       1000), # Float
                (1e-3        ,      0.001), # Float
            ]

        values += [
                 #        All ints
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                ("0xA"       ,         10), 
                ("012"       ,         10), 
                ("0o12"      ,         10), 
                ("0b01010"   ,         10), 
                ("10"        ,         10), 
                ("10.0"      ,         10), 
                ("1e1"       ,         10), 
            ]

        for _input, expected in values:
            value = to_number(_input)

            if isinstance(_input, str):
                cmd = 'to_number("{}")'.format(_input)
            else:
                cmd = 'to_number({})'.format(_input)

            print("{:23} = {:10} == {:10}".format(cmd, value, expected))
            self.assertEqual(value, expected)


0

এটি এমন একটি ফাংশন যা সরবরাহ করা প্রকৃত স্ট্রিংয়ের মতো দেখায় বা এর উপর ভিত্তি করে যে কোনও object(কেবল নয় str) intবা রূপান্তর করবে । আরও যদি এটি কোনও অবজেক্ট যার উভয় পদ্ধতি এবং পদ্ধতি থাকে তবে এটি ডিফল্ট ব্যবহারে থাকেfloat intfloat__float__int____float__

def conv_to_num(x, num_type='asis'):
    '''Converts an object to a number if possible.
    num_type: int, float, 'asis'
    Defaults to floating point in case of ambiguity.
    '''
    import numbers

    is_num, is_str, is_other = [False]*3

    if isinstance(x, numbers.Number):
        is_num = True
    elif isinstance(x, str):
        is_str = True

    is_other = not any([is_num, is_str])

    if is_num:
        res = x
    elif is_str:
        is_float, is_int, is_char = [False]*3
        try:
            res = float(x)
            if '.' in x:
                is_float = True
            else:
                is_int = True
        except ValueError:
            res = x
            is_char = True

    else:
        if num_type == 'asis':
            funcs = [int, float]
        else:
            funcs = [num_type]

        for func in funcs:
            try:
                res = func(x)
                break
            except TypeError:
                continue
        else:
            res = x

-1

ইনট এবং ফ্লোট পদ্ধতি ব্যবহার করে আমরা একটি স্ট্রিংকে পূর্ণসংখ্যা এবং ফ্লোটে রূপান্তর করতে পারি।

s="45.8"
print(float(s))

y='67'
print(int(y))

এই উত্তরটি নতুন কিছু যুক্ত করে না। উদাহরণস্বরূপ দেখুন, এই উত্তরটি একই তথ্য এবং আরও অনেক কিছু দেয়।
জর্জি

-3

eval()এই প্রশ্নের একটি খুব ভাল সমাধান। সংখ্যাটি আন্ত বা ভাসমান কিনা তা খতিয়ে দেখার দরকার নেই, এটি কেবলমাত্র সমতুল্য দেয়। অন্যান্য পদ্ধতির প্রয়োজন হলে চেষ্টা করুন

if '.' in string:
    print(float(string))
else:
    print(int(string))

চেষ্টা বাদে বিকল্প হিসাবেও ব্যবহার করা যেতে পারে। চেষ্টা ব্লকের ভিতরে স্ট্রিংকে ইন্টিতে রূপান্তর করার চেষ্টা করুন। যদি স্ট্রিংটি একটি ভাসমান মান হয়ে থাকে তবে এটি একটি ত্রুটি ফেলে দেবে যা ব্লক ব্যতীত এই জাতীয় ক্যাশে রাখা হবে

try:
    print(int(string))
except:
    print(float(string))

-10

আপনার প্রশ্নের আরেকটি ব্যাখ্যা এখানে দেওয়া হয়েছে (ইঙ্গিত: এটি অস্পষ্ট)। আপনি এটির মতো কিছু সন্ধান করছেন এটি সম্ভব:

def parseIntOrFloat( aString ):
    return eval( aString )

এটি এভাবে কাজ করে ...

>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

তাত্ত্বিকভাবে, একটি ইঞ্জেকশন দুর্বলতা আছে। স্ট্রিং, উদাহরণস্বরূপ হতে পারে "import os; os.abort()"। স্ট্রিংটি কোথা থেকে এসেছে তার কোনও ব্যাকগ্রাউন্ড ছাড়াই, সম্ভাবনাটি তাত্ত্বিক অনুমান। যেহেতু প্রশ্নটি অস্পষ্ট তাই এই দুর্বলতাটি আসলে বিদ্যমান কিনা তা মোটেই পরিষ্কার নয়।


7
এমনকি যদি তার ইনপুটটি 100% নিরাপদ eval()হয় তবে 3 গুণ বেশি ধীর হয় try: int(s) except: float(s)
সিস টিমারম্যান

1
ভাল, evalখারাপ অভ্যাস (আপনার অবশ্যই জানা উচিত কারণ আপনার 310 কে খ্যাতি রয়েছে)
ইউ 10-ফরওয়ার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.