@@ -480,6 +480,25 @@ def unicode_table(
480480 return "" .join (out )
481481
482482
483+ def format_number (number , sig_digits = 8 ):
484+ """
485+ Format a number with thin spaces as thousands separators
486+ and up to `sig_digits` significant digits using 'g' format.
487+
488+ number: int, float, or a numeric string.
489+ sig_digits: int, number of significant digits to display.
490+ Returns a string.
491+ """
492+ if isinstance (number , str ):
493+ try :
494+ number = float (number )
495+ except ValueError :
496+ raise TypeError ("The string cannot be converted to a number" )
497+
498+ fmt = f",.{ sig_digits } g"
499+ return format (number , fmt ).replace ("," , "\u2009 " )
500+
501+
483502def html_table (rows , * , header ):
484503 headers = "" .join (f"<th>{ h } </th>" for h in header )
485504 rows = (
@@ -519,7 +538,7 @@ def tree_sequence_html(ts):
519538 f"""
520539 <tr>
521540 <td>{ name .capitalize ()} </td>
522- <td>{ table .num_rows :, } </td>
541+ <td>{ format_number ( table .num_rows ) } </td>
523542 <td>{ naturalsize (table .nbytes )} </td>
524543 <td style="text-align: center;">
525544 { '✅' if hasattr (table , "metadata" ) and len (table .metadata ) > 0
@@ -599,10 +618,10 @@ def tree_sequence_html(ts):
599618 </tr>
600619 </thead>
601620 <tbody>
602- <tr><td>Trees</td><td>{ ts .num_trees :, } </td></tr>
603- <tr><td>Sequence Length</td><td>{ ts .sequence_length :, } </td></tr>
621+ <tr><td>Trees</td><td>{ format_number ( ts .num_trees ) } </td></tr>
622+ <tr><td>Sequence Length</td><td>{ format_number ( ts .sequence_length ) } </td></tr>
604623 <tr><td>Time Units</td><td>{ ts .time_units } </td></tr>
605- <tr><td>Sample Nodes</td><td>{ ts .num_samples :, } </td></tr>
624+ <tr><td>Sample Nodes</td><td>{ format_number ( ts .num_samples ) } </td></tr>
606625 <tr><td>Total Size</td><td>{ naturalsize (ts .nbytes )} </td></tr>
607626 <tr>
608627 <td>Metadata</td><td style="text-align: left;">{ md } </td>
@@ -671,13 +690,13 @@ def tree_html(tree):
671690 </tr>
672691 </thead>
673692 <tbody>
674- <tr><td>Index</td><td>{ tree .index :, } </td></tr>
675- <tr><td>Interval</td><td>{ tree .interval .left :,.8g } -{ tree .interval .right :,.8g } ({ tree .span :,.8g } )</td></tr>
676- <tr><td>Roots</td><td>{ tree .num_roots :, } </td></tr>
677- <tr><td>Nodes</td><td>{ len (tree .preorder ()):, } </td></tr>
678- <tr><td>Sites</td><td>{ tree .num_sites :, } </td></tr>
679- <tr><td>Mutations</td><td>{ tree .num_mutations :, } </td></tr>
680- <tr><td>Total Branch Length</td><td>{ tree .total_branch_length :,.8g } </td></tr>
693+ <tr><td>Index</td><td>{ format_number ( tree .index ) } </td></tr>
694+ <tr><td>Interval</td><td>{ format_number ( tree .interval .left ) } -{ format_number ( tree .interval .right ) } ({ format_number ( tree .span ) } )</td></tr>
695+ <tr><td>Roots</td><td>{ format_number ( tree .num_roots ) } </td></tr>
696+ <tr><td>Nodes</td><td>{ format_number ( len (tree .preorder ())) } </td></tr>
697+ <tr><td>Sites</td><td>{ format_number ( tree .num_sites ) } </td></tr>
698+ <tr><td>Mutations</td><td>{ format_number ( tree .num_mutations ) } </td></tr>
699+ <tr><td>Total Branch Length</td><td>{ format_number ( tree .total_branch_length ) } </td></tr>
681700 </tbody>
682701 </table>
683702 </div>
@@ -746,18 +765,18 @@ def variant_html(variant):
746765 return (
747766 html_body_head
748767 + f"""
749- <tr><td>Site Id</td><td>{ site_id :, } </td></tr>
750- <tr><td>Site Position</td><td>{ site_position :,.8g } </td></tr>
751- <tr><td>Number of Samples</td><td>{ num_samples :, } </td></tr>
752- <tr><td>Number of Alleles</td><td>{ num_alleles :, } </td></tr>
768+ <tr><td>Site Id</td><td>{ format_number ( site_id ) } </td></tr>
769+ <tr><td>Site Position</td><td>{ format_number ( site_position ) } </td></tr>
770+ <tr><td>Number of Samples</td><td>{ format_number ( num_samples ) } </td></tr>
771+ <tr><td>Number of Alleles</td><td>{ format_number ( num_alleles ) } </td></tr>
753772 """
754773 + "\n " .join (
755774 [
756775 f"""<tr><td>Samples with Allele { 'missing' if k is None
757776 else "'" + k + "'" } </td><td>"""
758- + f"{ counts [k ]:, } "
777+ + f"{ format_number ( counts [k ]) } "
759778 + " "
760- + f"({ freqs [k ] * 100 :,.2g } %)"
779+ + f"({ format_number ( freqs [k ] * 100 , 2 ) } %)"
761780 + "</td></tr>"
762781 for k in variant .alleles
763782 ]
0 commit comments