Here I am required to use REGEX to do the stock price program, yet I found it almost impossible for me to do, I can only deal with for loop.
'''Parse Stock prices. Create a function that will
decode the old-style fractional stock price. The price
can be a simple floating point number or it can be a
fraction, for example, 4 5/8.

Develop two patterns, one for numbers with optional
decimal places and another for a number with a space
and a fraction. Write a function that accepts a string
and checks both patterns, returning the correct decimal
price for whole numbers (e.g., 14), decimal prices
(e.g., 5.28) and fractional prices (27 1/4).

For the fractional prices (27 1/4), only whole numbers
are allowed in it, and the fractional part must be proper,
that is, it must in the (0,1) range, excluding 0 and 1.
Otherwise, your fuction should return float('nan'),
that is, Not-A-Number.

return a float type object representing the parsed price.

For example,

``````stock_price('27 1/4') returns float('27.25')
stock_price('27 4/2') returns float('nan')
stock_price('1/2') returns float('0.5')
stock_price('half') returns float('nan')
stock_price('0.1/0.2') returns float('nan')
stock_price('0.2') returns float('0.2')
stock_price('2') returns float('2')
'''
def stock_price(price):
if price.count('.')==1:
while price.count('/')==0:# 如果有'.'和'/',那么pretest将其输出为'nan'
return float(price) #如果有'.'没有'/'，那么就是直接转为float
return float('nan')
elif price.count('.')==0:
if  price.count('/')==1:#如果没有'.'，有'/'
b=price.find('/')  #找到'/'和 ' '所在的位置（如果有' '的话）
c=price.find(' ')
if price[b-1]<price[b+1] and price.count(' ')==1:#前面的数字小于后面的数字
return float(int(price[:c])+int(price[c+1:b])/int(price[b+1:]))
#找到位置后，将string分开并且转成int，此时有' '，那么将' '前面的数字和后面'/'
#前后的数字相除即可
elif price[b-1]<price[b+1] and price.count(' ')==0:#前面的数字小于后面的数字
return float(int(price[:b])/int(price[b+1:]))
#如果没有' '，那么直接将'/'前后的数字相除即可
else:
return float('nan')
#如果'/'前面的数字大于后面的数字，就输出'nan'
elif price.count('/')==0: #既没有'.'也没有'/'
if price.isdigit()==True:#如果是数字，没有' '
return float(price)
else: #如果不是数字，包括其中包含' '
return float('nan')
else: # 多于两个'.的输入一定无效
return float('nan')
``````

Edited by mike_2000_17: Fixed formatting

2
Contributors
1
2
Views
7 Years
Discussion Span
Last Post by cghtkh

This problem may be solved using 're' more easily.
But just to correct your mistake, do the following:
1. Change line 11 to

``return int(price[:c])+float(int(price[c+1:b]))/int(price[b+1:])``

2. Change line 15 to

``return float(int(price[:b]))/int(price[b+1:])``

3. Change line 22 to

``return price``

You should also change return float('nan') to just return 'nan', although it doesn't matter.

Edited by cghtkh: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.