表示する時に書式を調整する。

ユーザーごとに閲覧制限を設定できるようになったが、まだまだ改善したい項目が多い。まず気になるのが、表示する時の書式。現状では文字列も数値も全て左寄せ、データベースに保存されたデータをそのまま表示しているだけだ。会社決算の資料を閲覧するために活用するなら、最低限、数値は右寄せして、3桁ごとに桁区切りをしたい。
ところが、CSVファイルには書式情報は含まれていない。それでは書式設定のためのレコードを1行追加しようとも考えたが、ユーザーの立場で考えれば、それは面倒だ。CSVファイルをアップロードするために行うファイル修正は、最小限に留めたい。出来れば無修正のままアップロードできるのがベスト。そこで、データの形式からサーバー側で判断して、表示書式を一定のルールで勝手に決めてしまうことにした。

書式判定のルール

    • 数字または+-\.,%だけで構成されるデータは数値と見なし、右寄せにする。
    • 数値は3桁ごとにカンマで区切る。但し、%が含まれている場合は桁区切りはしない。
    • 数値以外は全て文字列として扱い、左寄せにする。
    • 先頭と末尾の'または"は表示しない。(例:'123 や "456"は文字列と見なされ、表示上は数値と同じだが左寄せになる。)

コードの修正

上記のようなルールで、早速、修正してみた。

<%#---------- app/views/displays/_display.rhtml ----------%>
<% # The following is used when the browser doesn't have javascript enabled %>
<% classAttr = cycle("", "class=\"even\"") %>
<% @options = params.merge(:controller => '/displays', :action => "view", :id => display.send("#{Display.primary_key}")) %>

<tr <%= classAttr %> id="<%= element_row_id(@options) %>" <%= "style=\"display: none;\"" if hidden %>>
  <% for scaffold_column in scaffold_columns %>
    <% column_value = eval(scaffold_column.eval) rescue nil %>
    <%# 以下1行追記:数値または+-\.,%であれば、右寄せにする。 %>
    <% position = /^[\d+-\\\.,%]+$/ =~ column_value ? 'right' : 'left' %>
    <%# 以下1行追記:数値または+-\.,であれば、カンマ区切りで表示する。例:-1,234,567,890 %>
    <% column_value = column_value.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, '\1,') if /^[\d+-\\\.,]+$/ =~ column_value %>
    <%# 右寄せにする。 align="<%= position %>" を追記 %>
    <td class="<%= column_class(scaffold_column.name, column_value, current_sort(params), scaffold_column.class_name) %>" align="<%= position %>" >
      <%# 先頭または末尾の"と'は表示しない。column_value.gsub(/^["']|["']$/, '') を追記 %>
      <%= format_column(column_value.gsub(/^["']|["']$/, '') , scaffold_column.sanitize?)%>
    </td>
  <% end %>
  <td class="actions">
...(以下省略)...

正規表現でデータの書式を判定しているが、それがかなり強力だ。もしRuby正規表現が使えなかったら、かなり面倒な作業になってしまいそうだ。まだ、あまりよく分かっていないが、使いこなせれば、かなり高度な判定処理が出来そうだ。


修正後の表示はこんな感じ。組織列の分類コードは、'100 のように記入している。(100 のままだと右寄せになってしまうので...。)

書式設定の自由度は低いけど、まあまあ満足。