จัดแนวคอลัมน์แนวตั้งของตัวเลขบนจุดทศนิยม


9

ฉันเขียนโพสต์นี้ใน Emacs เพื่อที่จะทำให้ตารางดูดีฉันตัดสินใจปรับระยะห่างเพื่อให้ทศนิยมเรียงกันอย่างเรียบร้อย รูปแบบดั้งเดิมจากฐานข้อมูลมีลักษณะดังนี้:

emacs                11505 227          3.6       3.3         1.9         68.9          93.5        68         
vi                   1087  289          11.1      6.9         2.9         71.7          96.2        9          
wolfram-mathematica  2993  360          4         2.2         1.9         66.7          92.5        51         

มันค่อนข้างใกล้เคียงกัน แต่ฉันต้องการคอลัมน์ที่ถูกต้อง คอลัมน์ที่สี่ควรมีลักษณะดังนี้:

 3.6
11.1
 4

ฉันเล่นโดยใช้คำสั่งจัดตำแหน่งและไม่สามารถหาวิธีจัดตารางโดยอัตโนมัติบนจุดทศนิยม (ทางเลือก) ด้วยเหตุผลบางอย่างคำแนะนำเหล่านี้ไม่สามารถจัดเรียงอะไรเลย:

M-- M-x alignตัวเลขยังสามารถเรียงรายขึ้นด้วยความเคารพจุดทศนิยมใช้

คำตอบ:


8

ขั้นแรกคุณต้องแน่ใจว่าบัฟเฟอร์อยู่ในโหมด Text :

M-x text-mode

เมื่ออยู่ในโหมดข้อความC-- M-x align(ซึ่งเรียกใช้text-dollar-figureกฎการจัดตำแหน่ง) จะจัดตำแหน่งทศนิยมแรกในแนวตั้ง แต่มันล้มเหลวในการจัดตำแหน่งคอลัมน์ทศนิยมที่สอง นอกจากนี้ยังไม่สามารถจัดตำแหน่งตัวเลขที่ไม่มีจุดทศนิยมอย่างชัดเจน (เช่นคะแนนเฉลี่ยของ wolfram-mathematica ที่ 4) ในการแก้ไขนั้นคุณจะต้องปรับค่าของกฎในalign-rules-list:

(text-dollar-figure
  (regexp . "\\$?\\(\\s-+[0-9]+\\)\\.?")
  (modes . align-text-modes)
  (repeat . t)
  (spacing . 2)
  (justify . t)
  (run-if lambda nil
      (eq '- current-prefix-arg)))

นั่นทำบางสิ่ง:

  • ตอนนี้ regexp อนุญาตสำหรับช่วงเวลาต่อท้ายไม่บังคับ
  • เมื่อเปิดใช้การทำซ้ำแต่ละอินสแตนซ์ของตัวเลขจะถูกจัดตำแหน่ง
  • ฉันเพิ่ม 2 ช่องว่างแทนที่จะเป็นช่องเดียวเพื่อให้อ่านได้

ผลลัพธ์:

emacs                11505  227   3.6  3.3  1.9  68.9  93.5   68         
vi                    1087  289  11.1  6.9  2.9  71.7  96.2    9          
wolfram-mathematica   2993  360   4    2.2  1.9  66.7  92.5   51         

วิธีการเทียบเท่าที่มากหรือน้อยคือการกำหนดฟังก์ชั่นที่เรียกใช้align-regexp:

(defun align-decimal (start end)
    "Align a table of numbers on (optional) decimal points."
    (interactive "r")
    (align-regexp start end "\\(\\s-*\\)\\$?\\(\\s-+[0-9]+\\)\\.?"
                  -2 0 t))

ในกรณีนี้ฉันตั้งค่าgroupsพารามิเตอร์เป็นจำนวนลบเพื่อเปิดการให้เหตุผลที่ถูกต้องและspacingเป็น 0 เพื่อรักษาระยะห่างดั้งเดิมให้มากที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.