Эта публикация является реконструкцией вопроса " Преобразование 18-значного идентификатора в верхнем регистре в действительный идентификатор" на бирже стека Salesforce". Размещенное здесь решение преобразует решение Адриана Ларсона в восстановление идентификатора upcase из APEX.в Python 3.
Решение APEX, преобразованное в Python 3:
def getBitPatterns(c):
CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'
index = CHARS.find(c)
result = []
for bitNumber in range(0,5):
result.append((index & (1 << bitNumber)) != 0)
return result
def repairCasing(x18DigitId):
if len(x18DigitId) < 18:
return 'Error'
toUpper = []
toUpper.append(getBitPatterns(x18DigitId[15:16]))
toUpper.append(getBitPatterns(x18DigitId[16:17]))
toUpper.append(getBitPatterns(x18DigitId[17:18]))
toUpper = [item for sublist in toUpper for item in sublist]
output = ''.join([x18DigitId[x].upper() if toUpper[x] else x18DigitId[x].lower() for x in range(0,15)]) + x18DigitId[15:].upper()
return output
Пример:
repairCasing('003i000001IIGW7AAH')
Out:
'003i000001IIGw7AAH'
Примечание:
Для учащихся
toUpper = [item for sublist in toUpper for item in sublist]
- это метод составления списков для объединения массивов в массиве в один массив (благодарность АлексуМартинелли на Как сделать плоский список из списка списков? ) и эквивалентен:
for sublist in toUpper:
for item in sublist:
newList.append(item)
toUpper = newList
Аналогично:
output = ''.join([x18DigitId[x].upper() if toUpper[x] else x18DigitId[x].lower() for x in range(0,15)]) + x18DigitId[15:].upper()
является списком-эквивалентом:
output = ''
for i in range(0,15):
c = x18DigitId[i:i+1]
if toUpper[i]:
output += c.upper()
else:
output += c.lower()
output += x18DigitId[15:18].upper()