我有一列包含英语和日语字符的列,我需要以右对齐的方式打印该列。
这是我应该打印的列:
column = ["通常残業時間", "bbbbbbbbb", "tttt"]
通常的方法是获得最大的字符串长度并相应地进行调整,但问题是文本也使用日语,并且日语字符的宽度大于英语字符的宽度。在这种情况下,我应该如何比较字符串长度并进行相应打印?
这是必需的输出:
通常残業時間
bbbbbbbbb
tttt
我正在使用Python3。
答案 0 :(得分:0)
问题是日语字符的宽度比英语字符以及空格要宽一些。' '
有针对这种情况的解决方案。您只需要计算这两种语言的宽度即可。
columns = ["通常残業時間", "bbbbbbbbb", "tttt"]
for i in column:
print('|'.join(list(i)))
您可能会得到类似的东西。
通|常|残|業|時|間
b|b|b|b|b|b|b|b|b
t|t|t|t
您可以使用|
查找宽度的关系。
在这里,我认为,这几乎就像是5个日语等于9个英语字符(请不要忘记减去|
。)
获得宽度关系时。
那我想您可能知道如何计算它们应适合的长度。
对于上述错误或误导性建议,我们深表歉意。我意识到,除非找到不同的宽度来适应不同的语言字符,否则无法使其对齐。
但是我想我可能会发现一些与此相关的问题以及一些有用的信息。
Display width of unicode strings in Python [duplicate]
kitchen.text.display.textual_width 不幸的是,它仅适用于python2.7 ...
答案 1 :(得分:0)
似乎汉字(和中文)字母的长度是ascii的两倍。
因此,我将使用.encode('ascii')
和UnicodeEncodeError
来检查行是否为ascii。 (基于此处的答案:https://stackoverflow.com/a/196391/837627)
如果是ascii,我们将需要在行前面添加更多空间。
这是一个解决方案:
words = ["hhhh", "你你你你你你"]
max_length = 0
# Find the max length string in the array
# For kanji strings, the max length is doubled
for line in words:
line_length = 0
try:
line.encode('ascii')
except UnicodeEncodeError:
line_length = 2 * len(line)
else:
line_length = len(line)
if max_length < line_length:
max_length = line_length
# Find the number of spaces to add by subtracting max line length by length of current line
# If current line is kanji, it is twice a ascii string length
for line in words:
space = 0
try:
line.encode('ascii')
except UnicodeEncodeError:
space = max_length - (len(line)*2)
else:
space = max_length - len(line)
print((' ')*space + line)
输出:
hhhh
你你你你你你
第一行的长度为4个ASCII字符。第二行是6个中文字符长== 12个ascii字符长。因此,第一行前面需要12-4=8
个空格(MONOSPACE !!!)。在StackOverflow中看起来不正确,但是由于等宽字体,在终端中它将对齐。
顺便说一句,我使用Python3编写了此解决方案。
答案 2 :(得分:0)
您可以在if (interactive()) {
ui <- fluidPage(
selectizeInput('email', 'Enter Email ID', choices = sam,options = list(
placeholder = "Please select your Email ID",
onInitialize = I('function() { this.setValue(""); }'))),
textInput('fn', ' Enter your First Name'),
textInput('ln', 'Enter your Last Name')
)
server <- function(input, output, session) {
observeEvent(input$email,{
check <- paste(input$email)
fetchvalue <- sqldf("select * from dataset where `Email` == 'check'")
first <- fetchvalue$First
updateTextInput(session, "fn",value = first)
})
}
shinyApp(ui, server)
}
的最后两项上使用r.just
column
column = ["通常残業時間", "bbbbbbbbb", "tttt"] for idx, item in enumerate(column): if not idx: print(item) else: print(item.rjust(12))