在列表中添加一个数字,使其变为 20%
Add a number in list so it becomes 20 percent
我想在一个数字列表中添加一个数字,以便在将该数字添加到该列表后,它占整个列表的 20%。
目标是在 itextsharp PDF 中创建 table 时设置第一列的绝对宽度 (20%) 和其他列的相对宽度。
例如这里有一个列表 {10,30,20,20}。我应该在其中添加什么,它也是列表总和的 20%,即 20 ( 20+10+30+20+20 = 100, 20/100 -> 20%)。
一些基础数学,例如 0.20 = x / (Sum + x) 可以得到 x = Sum/4。所以 Enumerable.Sum
会给你大部分结果:
listOfInt.Add (listOfInt.Sum()/4);
所以我的理解是您希望第 1 列的宽度是所有列宽度的 20%。您需要将所有列相加:
TOTAL_WIDTH = COL1 + COL2 + COL3 + ...
COL1 = 0.2 * TOTAL_WIDTH
COL1 = 0.2 (COL1 + COL2 + COL3 + ...)
COL1 - 0.2 * COL1 = 0.2 * (COL2 + COL3 + ...)
0.8 * COL1 = 0.2 * (COL2 + COL3 + ...)
COL1 = 0.25 * (COL2 + COL3 + ...)
这是你需要做的:
N4 = TOTAL * 0.2
N1 + N2 + N3 + TOTAL * 0.2 = TOTAL
N1 + N2 + N3 = TOTAL * 0.8
(N1 + N2 + N3) / 0.8 = TOTAL
所以...
N4 = ((N1 + N2 + N3) / 0.8) * 0.2
N4 = (N1 + N2 + N3) / 4
所以让这个数字成为其他数字总和的 25% 就完成了。
你问题的第一部分很奇怪:你说的是一个列表,就好像你希望第一个项目占整个列表的 20%。您应该添加一张图来帮助我们理解这意味着什么。
你问题的第二部分是关于table。这很简单。如果你查看官方文档,你会找到问题的答案 How to change width of single column of table?
您可以使用setWidths()
方法设置相对宽度。在您的情况下,您将拥有:
int columns = 8;
float[] widths = new float[columns];
float[0] = 20f;
for (int i = 1; i < columns; i++)
float[i] = 80 / (columns - 1);
PdfPTable table = new PdfPTable(columns);
table.setWidths(widths);
如果您需要多于或少于 8 列,请将 8
更改为您想要的任何数字。
更新:
同时,你已经澄清了你的问题。
假设您有一个名为 widths1
的 float[]
,它包含 table 的宽度。请注意,您将需要 float
而不是 int
,因为我们要进行除法。
在这种情况下,您可以这样做:
int n = widths1.length;
float total = 0;
for (int i = 0; i < n; i++)
total += widths1[i];
n++;
float[] widths2 = new float[n];
widths2[0] = total / 4;
for (int i = 1; i < n; i++)
widths2[i] = widths1[i - 1];
PdfPTable table = new PdfPTable(n);
table.setWidths(widths2);
我想在一个数字列表中添加一个数字,以便在将该数字添加到该列表后,它占整个列表的 20%。
目标是在 itextsharp PDF 中创建 table 时设置第一列的绝对宽度 (20%) 和其他列的相对宽度。
例如这里有一个列表 {10,30,20,20}。我应该在其中添加什么,它也是列表总和的 20%,即 20 ( 20+10+30+20+20 = 100, 20/100 -> 20%)。
一些基础数学,例如 0.20 = x / (Sum + x) 可以得到 x = Sum/4。所以 Enumerable.Sum
会给你大部分结果:
listOfInt.Add (listOfInt.Sum()/4);
所以我的理解是您希望第 1 列的宽度是所有列宽度的 20%。您需要将所有列相加:
TOTAL_WIDTH = COL1 + COL2 + COL3 + ...
COL1 = 0.2 * TOTAL_WIDTH
COL1 = 0.2 (COL1 + COL2 + COL3 + ...)
COL1 - 0.2 * COL1 = 0.2 * (COL2 + COL3 + ...)
0.8 * COL1 = 0.2 * (COL2 + COL3 + ...)
COL1 = 0.25 * (COL2 + COL3 + ...)
这是你需要做的:
N4 = TOTAL * 0.2
N1 + N2 + N3 + TOTAL * 0.2 = TOTAL
N1 + N2 + N3 = TOTAL * 0.8
(N1 + N2 + N3) / 0.8 = TOTAL
所以...
N4 = ((N1 + N2 + N3) / 0.8) * 0.2
N4 = (N1 + N2 + N3) / 4
所以让这个数字成为其他数字总和的 25% 就完成了。
你问题的第一部分很奇怪:你说的是一个列表,就好像你希望第一个项目占整个列表的 20%。您应该添加一张图来帮助我们理解这意味着什么。
你问题的第二部分是关于table。这很简单。如果你查看官方文档,你会找到问题的答案 How to change width of single column of table?
您可以使用setWidths()
方法设置相对宽度。在您的情况下,您将拥有:
int columns = 8;
float[] widths = new float[columns];
float[0] = 20f;
for (int i = 1; i < columns; i++)
float[i] = 80 / (columns - 1);
PdfPTable table = new PdfPTable(columns);
table.setWidths(widths);
如果您需要多于或少于 8 列,请将 8
更改为您想要的任何数字。
更新:
同时,你已经澄清了你的问题。
假设您有一个名为 widths1
的 float[]
,它包含 table 的宽度。请注意,您将需要 float
而不是 int
,因为我们要进行除法。
在这种情况下,您可以这样做:
int n = widths1.length;
float total = 0;
for (int i = 0; i < n; i++)
total += widths1[i];
n++;
float[] widths2 = new float[n];
widths2[0] = total / 4;
for (int i = 1; i < n; i++)
widths2[i] = widths1[i - 1];
PdfPTable table = new PdfPTable(n);
table.setWidths(widths2);